J'ai une vue qui est UIViewController
(racine) qui gère les annonces et un UINavigationController
. Dans ce UINavigationController, j'ai des couches typiques de contrôleurs. Dans mon contrôleur de vue de table de paramètres personnalisés, j'ai un bouton pour me contacter pour le support. Lorsque l'utilisateur clique sur ce bouton, je crée un MFMailComposeViewController
et je souhaite le présenter. Je ne peux pas le présenter à partir de la vue du tableau des paramètres car il se trouvera sous mes annonces, je dois donc référencer la vue racine et la présenter à partir de là. J'ai essayé self.parentViewController.parentViewController
où self est la vue du tableau des paramètres, mais cela ne fonctionne pas. Comment dois-je y faire référence. Cela semble être une mauvaise conception d'avoir à référencer directement la vue racine et à la passer à la vue des paramètres.
Obtenez la clé actuelleWindow:
UIWindow *window = [UIApplication sharedApplication].keyWindow;
Obtenez son rootViewController:
UIViewController *rootViewController = window.rootViewController;
NOTE : Si un UIAlertView
est actuellement affiché, une nouvelle fenêtre est en cours de création et affectée pour être le keyWindow. Il peut également y avoir d'autres cas exceptionnels qui ne garderont pas la fenêtre de votre application comme clé de fenêtre.
D'après mon expérience, c'est la solution idéale pour obtenir le rootViewController
:
[[[[UIApplication sharedApplication] delegate] window] rootViewController]
Remarque: dans le cas d'un UIAlert
ou UIActionSheet
actif, vous obtenez l'alerte ou la feuille d'action comme fenêtre clé.
Utilisez l'application singleton. Quelque chose comme:
[[[UIApplication sharedApplication] delegate] rootViewController]
devrait l'obtenir si votre viewController qui est la racine est nommé rootViewController
Vous pouvez toujours résoudre ce problème avec 1 ligne de code, mais je recommande ceci Swift façon de le faire, vous pouvez l'appeler de n'importe où, c'est aussi sûr pour les plantages et les bugs:
/// 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: