रूट व्यू कंट्रोलर कैसे प्राप्त करें?


109

मुझे रूट व्यू कंट्रोलर का एक उदाहरण चाहिए।

मैंने उन तरीकों की कोशिश की:

UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];

यह दिखाता है: शून्य :

इसके अलावा जब मैं नियंत्रकों की एक सरणी प्राप्त करने की कोशिश करता हूं:

NSArray *viewControllers = self.navigationController.viewControllers;

यह केवल एक नियंत्रक लौटाता है, लेकिन यह मेरा मूल दृश्य नियंत्रक नहीं है।

अगर मैं नेविगेशन नियंत्रक से लेने की कोशिश करता हूं:

UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];

यह दिखाता है: शून्य :

कोई विचार क्यों? अपने मूल दृश्य नियंत्रक का एक उदाहरण प्राप्त करने के लिए मैं और क्या प्रयास कर सकता हूं?

धन्यवाद।


KeyWindow सक्रिय विंडो है, उदाहरण के लिए, जब आप एक UIAlertView दिखाते हैं, तो UIAlertView की विंडो keyWindow होती है, लेकिन यह AppDelegate की विंडो नहीं होती है। यदि आप एप्लिकेशन का रूट कोड कंट्रोलर प्राप्त करना चाहते हैं, तो शायद [[[UIApplication साझाApplication] डेलीगेट] rootViewIontroller विंडो का उपयोग करें। ] बेहतर है।
无 之 无

जवाबों:


213

अगर आप rootViewControllerअपने ऐपडेलगेट में सेट किए गए एक्सेस को एक्सेस करने की कोशिश कर रहे हैं । इसे इस्तेमाल करे:

उद्देश्य सी

YourViewController *rootController = (YourViewController*)[[(YourAppDelegate*)
                                   [[UIApplication sharedApplication]delegate] window] rootViewController];

तीव्र

let appDelegate  = UIApplication.sharedApplication().delegate as AppDelegate
let viewController = appDelegate.window!.rootViewController as YourViewController

स्विफ्ट 3

let appDelegate  = UIApplication.shared.delegate as! AppDelegate
let viewController = appDelegate.window!.rootViewController as! YourViewController

स्विफ्ट 4 और 4.2

let viewController = UIApplication.shared.keyWindow!.rootViewController as! YourViewController

स्विफ्ट 5 और 5.1 और 5.2

let viewController = UIApplication.shared.windows.first!.rootViewController as! YourViewController

3
YourViewController * rootController = (YourViewController *) [[(YourAppDelegate *) [[UIApplication sharedApplication] डेलीगेट] खिड़की] rootViewController];
क्रेग मूर

1
Swift2 में, आपको अनडैप करने के लिए "AppDelegate = UIApplication.saredApplication ()। AppDelegate के रूप में प्रतिनिधि" का उपयोग करना होगा
जैकी

क्या इस तरीके से दो नियंत्रकों को नियत करने का कोई तरीका है ताकि आप दोनों को घड़ी से डेटा खींच सकें?
जॉनी मारिन

1
यह एक लाइफसेवर है। धन्यवाद! स्वादिष्ट कोड के इस टुकड़े को खोजने के लिए मुझे महीनों लग गए!
ItsMeDom

37

उद्देश्य सी

UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;

स्विफ्ट 2.0

let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController

स्विफ्ट 5

let viewController = UIApplication.shared.keyWindow?.rootViewController

3
यह शीर्ष उत्तर होना चाहिए। +1 अन्य उत्तर तब काम नहीं करेंगे जब आपको रूट व्यू कंट्रोलर को एक अलग फ्रेमवर्क से संदर्भित करने की आवश्यकता हो, जो कि आपका मुख्य ऐप निर्भर है।
सी। तिवाल्ट

10

जैसा कि यहाँ @ 0x7fffffff द्वारा सुझाया गया है, अगर आपके पास UINavigationController है तो इसे करना आसान हो सकता है:

YourViewController *rootController =
    (YourViewController *)
        [self.navigationController.viewControllers objectAtIndex: 0];

ऊपर दिए गए उत्तर में कोड UINavigation कंट्रोलर (यदि आपके पास है) और यदि आपकी जरूरत है, तो आप इसका उपयोग कर सकते हैं self.navigationController


5

जब तक आपके पास कोई अच्छा कारण न हो, अपने रूट कंट्रोलर में ऐसा करें:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onTheEvent:)
                                             name:@"ABCMyEvent"
                                           object:nil];

और जब आप इसे सूचित करना चाहते हैं:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
                                                object:self];                

2

स्विफ्ट 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

1

इसे करने के लिए स्विफ्ट तरीका है, आप इसे कहीं से भी कॉल कर सकते हैं, यह वैकल्पिक रिटर्न देता है इसलिए उसके बारे में देखें:

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
var topMostVC: UIViewController? {
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while let pVC = presentedVC?.presentedViewController {
        presentedVC = pVC
    }

    if presentedVC == nil {
        print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
    }
    return presentedVC
}

इसमें एक मानक कार्य के रूप में शामिल है:

https://github.com/goktugyil/EZSwiftExtensions


1

स्विफ्ट 3: चाज व्यूकोन्ट्रोलर के साथ बहस करें और AnyObject का उपयोग करें: पहचान MainPageViewController को लक्ष्य पर देखें

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)

या यदि आप नियंत्रक बदलना चाहते हैं और डेटा भेजना चाहते हैं

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

let dataToSend = "**Any String**" or  var ObjectToSend:**AnyObject** 

mainPage.getData = dataToSend 

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)  

आप सबसे अच्छे दोस्त हैं:
bsm-2000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.