Comment obtenir le contrôleur de vue racine?

J’ai besoin d’une instance de contrôleur de vue racine.

J’ai essayé ces approches:

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

Retourne: null :

Aussi quand j’essaie d’obtenir un tableau de contrôleurs:

 NSArray *viewControllers = self.navigationController.viewControllers; 

Il ne renvoie qu’un seul contrôleur, mais ce n’est pas mon contrôleur de vue racine.

Si j’essaie de prendre du contrôleur de navigation:

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

Retourne: null :

Des idées pourquoi? Que pourrais-je essayer d’autre pour obtenir une instance de mon contrôleur de vue racine?

Merci.

Si vous essayez d’accéder au rootViewController vous avez défini dans votre appDelegate. essaye ça:

Objectif c

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

Rapide

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

Swift 3

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

Rapide 4

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

Dans la main courte de l’access contrôleur de vue racine.

Objectif c

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

Swift 2.0

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

Format Objective-C:

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

Format Swift 2:

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

Format swift 3 et 4:

 let objViewController = UIApplication.shared.keyWindow?.rootViewController 

Comme suggéré ici par @ 0x7fffffff, si vous avez UINavigationController, cela peut être plus facile à faire:

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

Le code dans la réponse ci-dessus renvoie le contrôleur UINavigation (si vous en avez) et si c’est ce dont vous avez besoin, vous pouvez utiliser self.navigationController .

À moins que vous n’ayez une bonne raison, dans votre contrôleur racine, procédez comme suit:

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

Et quand vous voulez le notifier:

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

Un moyen rapide de le faire, vous pouvez appeler cela de n’importe où, il retourne facultatif, donc faites attention à cela:

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

Il est inclus en tant que fonction standard dans:

https://github.com/goktugyil/EZSwiftExtensions

Swift 3: capturer ViewController avecOut Segue et envoyer AnyObject Use: Identity MainPageViewController sur le ViewController cible

 let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController var mainPageNav = UINavigationController(rootViewController: mainPage) self.present(mainPageNav, animated: true, completion: nil) 

ou si vous souhaitez modifier View Controller et envoyer des données

 let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController let dataToSend = "**Any Ssortingng**" or var ObjectToSend:**AnyObject** mainPage.getData = dataToSend var mainPageNav = UINavigationController(rootViewController: mainPage) self.present(mainPageNav, animated: true, completion: nil) 

Swift 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

 let view:UIView = UIView() view.frame = CGRect(x:0, y:0, width:UIApplication.shared.statusBarFrame.width, height:UIApplication.shared.statusBarFrame.height view.backgroundColor = UIColor.init(named: "yourColor") UIApplication.shared.keyWindow!.rootViewController?.view.addSubview(view)