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, lorsque 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 puis-je essayer d'obtenir une instance de mon contrôleur de vue racine?
Merci.
si vous essayez d'accéder au rootViewController
que vous avez défini dans votre appDelegate. essaye ça:
Objective-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
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let viewController = appDelegate.window!.rootViewController as! YourViewController
Swift 4 & 4.2
let viewController = UIApplication.shared.keyWindow!.rootViewController as! YourViewController
En bref chemin d'accès contrôleur de vue racine.
Objectif C
UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
Swift 2.
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 simple:
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 un) et si c'est ce dont vous avez besoin, vous pouvez utiliser self.navigationController
.
À moins que vous n'ayez une bonne raison, procédez comme suit dans votre contrôleur racine:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onTheEvent:)
name:@"ABCMyEvent"
object:nil];
Et quand vous voulez le notifier:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
object:self];
Swift
let rootViewController = UIApplication.shared.keyWindow?.rootViewController
Manière rapide de le faire, vous pouvez appeler cela de n'importe où, il retourne optionnel alors 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
}
Son inclus en tant que fonction standard dans:
Swift 3: Chage ViewController withOut Segue et envoi de AnyObject Utilisation: Identity MainPageViewController sur 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 voulez changer le contrôleur de vue et envoyer des données
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)
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)