36 votes

Essayez de présenter * sur * dont la vue n'est pas dans la hiérarchie des fenêtres

J'essaie de créer un contrôleur de vue modale dans mon délégué d'application (j'ai créé une fonction appelée showLoginView). Mais chaque fois que j'essaie de l'appeler, un avertissement s'affiche dans XCode:

 Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy!
 

Voici le code de la méthode:

 - (void)showLoginView
{
    PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"];
    [self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil];
}
 

Comment puis-je ajouter la vue à la hiérarchie des fenêtres? Ou peut-être que je fais quelque chose de très faux?

31voto

HackyStack Points 2545

Vous ne pouvez pas afficher un contrôleur de vue modale à partir de appDelegate. Vous devez afficher un ViewController modal dans le viewController actuellement affiché en plein écran. En d'autres termes, vous devez insérer ce code dans votre contrôleur de vue racine ou dans celui par lequel vous souhaitez afficher le vC modal à partir de ...

En outre, vous voudrez utiliser la méthode "presentModalViewController" pour présenter le modal. Vous pouvez définir des propriétés sur le vc modal telles que:

 vC.modalPresentationStyle = UIModalPresentationFormSheet;
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:vC animated:YES];
 

21voto

Erwan Points 579

Vous pouvez réellement présenter un contrôleur de vue modale à partir de AppDelegate tant que vous détectez le viewController visible actuel et que vous vous occupez du cas où votre contrôleur actuel est un navigationController.

Voici ce que je fais:

 UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
   activeController = [(UINavigationController*) activeController visibleViewController];
}
[activeController presentModalViewController:loginViewController animated:YES];
 

8voto

SFeng Points 419
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]])
{
   activeController = [(UINavigationController*) activeController visibleViewController];
}
else if (activeController.modalViewController)
{
    activeController = activeController.modalViewController;
}
[activeController presentModalViewController:vc animated:YES];

7voto

David Points 703

J'ai rencontré ce problème sur iOS 7 - la solution pour que l'une des solutions proposées fonctionne est d'appeler

 [self.window makeKeyAndVisible];
 

dans votre AppDelegate . Après cet appel, présenter une vue modale à partir des rootViewController de la fenêtre a fonctionné.

3voto

iCoke Points 88

Vous pouvez NSLog (@ "% @", self.window.rootViewController) et voir ce qu'est réellement le rootViewController.

Je suis entré dans ce problème, quand le rootViewController est un UIViewController normal. Remplacez-le par un contrôleur UINavigation, si cela peut vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X