Kök görünüm denetleyicisi nasıl edinilir?


109

Kök görünüm denetleyicisinin bir örneğine ihtiyacım var.

Bu yaklaşımları denedim:

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

İade: boş :

Ayrıca bir dizi denetleyici almaya çalıştığımda:

NSArray *viewControllers = self.navigationController.viewControllers;

Yalnızca bir denetleyici döndürüyor, ancak bu benim kök görünüm denetleyicim değil.

Gezinme denetleyicisinden almaya çalışırsam:

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

İade: boş :

Herhangi bir fikriniz neden? Kök görünüm denetleyicimin bir örneğini başka ne deneyebilirim?

Teşekkürler.


KeyWindow aktif penceredir, örneğin, bir UIAlertView gösterdiğinizde, UIAlertView penceresi keyWindow'dur, ancak AppDelegate'in penceresi değildir. Uygulamanın rootViewController'ını almak istiyorsanız, belki [[[UIApplication sharedApplication] temsilci] penceresi] rootViewController'ı kullanın ] daha iyi.
无 夜 之 星辰

Yanıtlar:


213

rootViewControllerappDelegate'inizde belirlediğinize erişmeye çalışıyorsanız . bunu dene:

Objective-C

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

hızlı

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

Hızlı 3

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

Swift 4 ve 4.2

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

Swift 5 & 5.1 & 5.2

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

3
YourViewController * rootController = (YourViewController *) [[(YourAppDelegate *) [[UIApplication sharedApplication] temsilci] pencere] rootViewController];
Craig Moore

1
Swift2'de, açılmaya zorlamak için "let appDelegate = UIApplication.sharedApplication (). Delegate as! AppDelegate" kullanmanız gerekir
Jacky

Verileri her ikisinden de saate çekebilmeniz için bu şekilde atanmış iki denetleyiciye sahip olmanın bir yolu var mı?
Johnny Marin

1
Bu bir cankurtarandır. Teşekkür ederim! Bu lezzetli kodu bulmam aylarımı aldı!
ItsMeDom

37

Objective-C

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

Swift 2.0

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

Swift 5

let viewController = UIApplication.shared.keyWindow?.rootViewController

3
Bu en iyi cevap olmalı. +1 Ana uygulamanızın bağlı olduğu farklı bir çerçeveden kök görünüm denetleyicisine başvurmanız gerekirse, diğer yanıtlar işe yaramayacaktır.
C.Tewalt

10

Burada @ 0x7fffffff tarafından önerildiği gibi , UINavigationController'a sahipseniz bunu yapmak daha kolay olabilir:

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

Yukarıdaki cevapta yer alan kod, UINavigation kontrolcüsünü döndürür (eğer varsa) ve ihtiyacınız olan buysa, kullanabilirsiniz self.navigationController.


5

İyi bir nedeniniz yoksa, kök denetleyicinizde şunu yapın:

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

Ve onu bilgilendirmek istediğinizde:

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

2

Hızlı 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

1

Bunu yapmanın hızlı yolu, bunu her yerden arayabilirsin, isteğe bağlı olarak geri döner, bu yüzden şuna dikkat et:

/// 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
}

Aşağıdakilere standart bir işlev olarak dahildir:

https://github.com/goktugyil/EZSwiftExtensions


1

Swift 3: Segue ile Chage ViewController ve AnyObject gönder Kullanın: Identity MainPageViewController hedef ViewController üzerinde

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

var mainPageNav = UINavigationController(rootViewController: mainPage)

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

veya Görünüm Denetleyicisini Değiştirmek ve Verileri göndermek istiyorsanız

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)  

Sen iyi dostum :)
BSM-2000
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.