49 votes

iOS : comportement inattendu du popViewController

J'ai cherché une solution sur Internet. Il n'y a rien que je puisse trouver. Donc : J'utilise un UINavigationController. Je pousse deux UIViewControllers sur celui-ci. Dans le deuxième ViewController poussé, j'exécute ce code :

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog([error localizedDescription]);
[self.navigationController popViewControllerAnimated:YES]; }

La chose attendue serait que le dernier ViewController poussé disparaisse. Dans cette application, je fais cela à plusieurs endroits et cela fonctionne bien partout, sauf dans ce ViewController. Ce qui se passe, c'est que seul le bouton retour disparaît de l'écran (animé), mais tout le reste reste à l'écran. Dans la sortie de la console, deux choses sont imprimées lorsque cette ligne est exécutée :

2011-03-14 16:32:44.580 TheAppXY [18518:207] pop imbriquée imbriquées peut entraîner une corruption de la barre de navigation

2011-03-14 16:32:53.507 TheAppXY [18518:207] Finition d'une transition de transition de navigation dans un état inattendu inattendu. L'arbre de la sous-vue de la barre de navigation pourrait être corrompue.

Deux messages d'erreur sur lesquels je n'ai pu trouver AUCUNE information. J'utilise XCode 4 et iOS SDK 4.3. Peut-être que quelqu'un peut m'aider avec ce problème.

50voto

Vishal Chaudhry Points 901

J'ai rencontré une situation similaire dans mon code et le message disait :

l'animation push imbriquée peut entraîner une barre de navigation corrompue

Terminer une transition de navigation dans un état inattendu. L'arbre de la sous-vue de la barre de navigation >peut être corrompu.

J'ai trouvé ce problème en poussant deux contrôleurs de vue l'un après l'autre en succession rapide et les deux étaient animés.

Dans votre cas, il semble que vous fassiez apparaître successivement plusieurs contrôleurs de vue avec animation.

Par conséquent, lorsqu'une vue est en cours d'animation, vous ne devez pas commencer l'animation d'une autre vue.

J'ai également constaté que si je désactivais l'animation sur une vue, le message d'erreur disparaissait.

Dans mon cas, il s'agissait d'un problème de logique de flux, car je n'avais pas l'intention de pousser deux contrôleurs de vue l'un après l'autre. L'un était poussé dans la logique du switch case et l'autre après sa fin.

J'espère que cela aidera quelqu'un.

28voto

Grady Player Points 7823

Tu peux avoir ça à chaque fois que tu essaies de sauter avant viewDidAppear . Si vous définissez un drapeau, il suffit de vérifier ce drapeau dans le fichier viewDidAppear vous n'aurez pas de problème.

12voto

Andrew Points 928

J'ai créé un remplacement direct pour UINavigationController qui mettra les animations en file d'attente pour vous et évitera entièrement ce problème.

Prenez-le sur BufferedNavigationController

3voto

mbm29414 Points 4133

J'ai eu ce problème aussi, et voici ce qui a causé le mien :

  1. Dans le RootViewController, j'utilise plusieurs objets UISegmentedControl pour déterminer laquelle des nombreuses vues à charger ensuite.
  2. Dans cette (sous/2e) vue, j'ai fait un saut (en utilisant le bouton "Back") pour revenir au RootViewController.
  3. Dans RootViewController, j'utilisais viewWillAppear pour "réinitialiser" chacun de mes objets UISegmentedControl à un selectedSegmentIndex de -1 (ce qui signifie qu'aucun segment ne semble "pressé").
  4. Cette "réinitialisation" a permis à chacun de mes objets UISegmentedControl de déclencher les actions IBA associées (et distinctes).
  5. Comme je ne traitais pas une "sélection" de -1, j'avais plusieurs méthodes qui s'activaient en même temps, chacune essayant de pousser une vue différente.

Ma solution ? J'ai resserré mes instructions if...then et j'ai renoncé à l'exécution de tout code dans mes IBActions UISegmentedControl lorsque selectedSegmentIndex == -1.

Je ne sais toujours pas pourquoi j'ai eu des erreurs d'animation "pop" et non "push", mais au moins j'ai trouvé mon erreur et je l'ai réparée !

J'espère que cela aidera quelqu'un d'autre !

0voto

Sohan Points 699

J'ai eu le même problème. Il s'est avéré que je poussais le viewController dans une boucle, ce qui (en plus d'être une erreur vraiment stupide) provoquait cette erreur particulière.

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