113 votes

"L'application a essayé de présenter modalement un contrôleur actif" ?

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

L'application a essayé de présenter modalement un contrôleur actif UITabBarController : 0x83d7f00.

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

Je veux que l'un d'entre eux soit présenté de manière modale lorsqu'on le touche. J'ai fait cela 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 même classe que celui que je veux présenter de manière modale, je renvoie NO et fais

[tabBarController presentModalViewController:viewController animated:YES];

Et maintenant j'obtiens cette erreur, qui semble signifier que l'on ne peut pas présenter modalement un contrôleur de vue qui est actif ailleurs (dans la barre de tabulation...). Je dois dire que je suis sur XCode 4.2 Developer Preview 7, donc c'est iOS 5 (je sais à propos du NDA, mais je pense que je ne donne pas de détails interdits). Je n'ai pas actuellement d'installation XCode pour tester si cela plante la compilation avec le SDK iOS4, mais je suis presque entièrement sûr que ce n'est pas le cas.

Je voulais juste demander si quelqu'un avait déjà rencontré ce problème ou avait une suggestion à faire.

0 votes

Avant iOS 5, cette opération ne levait pas d'exception, mais ne renvoyait rien. À partir d'iOS 5, cette commande soulève une exception.

107voto

lswank Points 326

Supposons que vous ayez trois contrôleurs de vue instanciés de la manière suivante :

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 ceci :

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];

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

Apple attend de vous que vous traitiez les éléments de l'interface utilisateur d'une certaine manière. Cela est probablement enfoui quelque part dans les directives relatives à l'interface humaine sous la forme d'un "ne faites pas ça parce que nous ne nous attendons pas à ce que vous vouliez un jour faire ça".

6 votes

Le fait est que cela ne posait absolument aucun problème avant iOS 5, d'où mon inquiétude ! Ce que j'ai fait, c'est ajouter un UIViewController factice à la barre de tabulation et présenter modalement l'instance de la sous-classe du contrôleur de vue réel.

1 votes

@Iswank, maintenant dans iOS 6, pour rendre les choses plus "faciles", ils ont déprécié presentModalViewController causant toutes sortes de problèmes de rotation... vous devez utiliser presentViewController : animated : completion et vérifier comment votre application gère les changements.

16voto

Danil Points 802

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

[self dismissModalViewControllerAnimated:YES];

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

0 votes

Il échoue si vous le renvoyez animé, car au moment où vous voulez présenter à nouveau le contrôleur de vue modal, il est toujours modalement à l'écran, en train d'être animé.

2 votes

Il est déprécisé dans IOS 6.0.

16voto

Karthick Ramesh Points 840

Dans mon cas, j'ai essayé de présenter le viewController (j'ai la référence du viewController dans le TabBarViewController) à partir de différents viewcontrollers et il s'est écrasé avec le message ci-dessus. Dans ce cas, pour éviter la présentation, vous pouvez utiliser

viewController.isBeingPresented

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

Ça pourrait aider quelqu'un.

7voto

dig Points 1622

Le même problème m'est arrivé lorsque j'ai essayé de present un contrôleur de vue enfant au lieu de son UINavigationViewController parent

4voto

Erhan Demirci Points 1219

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

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

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