web-dev-qa-db-fra.com

"Application essayé de présenter modalement un contrôleur actif"?

Je viens de tomber sur un crash montrant un NSInvalidArgumentException avec ce message sur une application qui ne le faisait pas auparavant.

L'application a tenté de présenter sous forme modulaire un contrôleur actif UITabBarController: 0x83d7f00.

J'ai un UITabBarController que je crée dans le AppDelegate et lui donne le tableau de UIViewControllers.

L’un d’eux que je veux présenter sous forme modale quand on le tape sur le bouton. Je l'ai fait en implémentant la méthode du délégué

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

Si ce contrôleur de vue est de la classe de celle que je veux présenter de manière modale, je retourne NON et fais

[tabBarController presentModalViewController:viewController animated:YES];

Et maintenant je reçois cette erreur, ce qui semble vouloir dire que vous ne pouvez pas présenter de manière modale un contrôleur de vue actif ailleurs (dans la barre de tabulation ...). Je devrais dire que je suis sur XCode 4.2 Developer Preview 7, donc c'est iOS 5 (je connais la NDA, mais je pense que je ne donne pas de détails interdits). À l'heure actuelle, je n'ai pas d'installation XCode pour vérifier si la compilation avec le SDK iOS4 se bloque, mais je suis presque certain que ce n'est pas le cas.

Je voulais seulement demander si quelqu'un a connu ce problème ou a des suggestions

90
Javier Soto

Supposons que vous avez trois contrôleurs de vue instanciés comme ceci:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

Vous les avez ajoutés à une barre d'onglets comme celle-ci:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

Maintenant, vous essayez de faire quelque chose comme ça:

[tabBarController presentModalViewController:vc3];

Cela vous donnera une erreur parce que ce contrôleur de barre d’onglet a une emprise mortelle sur le contrôleur de vue que vous lui avez donné. Vous pouvez soit ne pas l'ajouter au tableau de contrôleurs de vue de la barre d'onglets, soit vous ne pouvez pas le présenter de manière modale.

Apple s'attend à ce que vous traitiez ses éléments d'interface utilisateur d'une certaine manière. Ceci est probablement enterré quelque part dans les directives d'interface humaine en tant que "ne le faites pas parce que nous ne nous attendons pas à ce que vous vouliez le faire".

91
lswank

J'ai le même problème. J'essaie de présenter le contrôleur de vue juste après avoir quitté le poste.

[self dismissModalViewControllerAnimated:YES];

Lorsque j'essaie de le faire sans animation, cela fonctionne parfaitement, le problème est que le contrôleur est toujours actif. Je pense que la meilleure solution est d'utiliser dismissViewControllerAnimated:completion: pour iOS5

13
Danil

Dans mon cas, j'essayais de présenter le viewController (j'ai la référence du viewController dans le TabBarViewController) à partir de différents contrôleurs de vue et il plantait avec le message ci-dessus. Dans ce cas, pour éviter de vous présenter, vous pouvez utiliser

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Peut aider quelqu'un.

6
Karthick Ramesh

J'ai eu le même problème.Je le résous. Vous pouvez essayer ce code:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
2
Erhan Demirci

Il suffit de retirer

[tabBarController presentModalViewController:viewController animated:YES];

et garde

[self dismissModalViewControllerAnimated:YES];
0
user170317