69 votes

Problème UINavigation sur iPhone: une animation Push imbriquée peut endommager la barre de navigation

J'obtiens les erreurs suivantes:

2011-04-02 14:55:23.350 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.352 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

Voici ce que je fais. À partir d'une vue contrôleur, j'appelle le suivant quand un bouton est enfoncé:

EventsViewController *viewController = [[EventsViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBar.tintColor = [UIColor blackColor];
[self presentModalViewController:navController animated:YES];
[viewController release];
[navController release];

Ensuite, si un bouton est enfoncé dans EventsController, je l'appelle:

SingleEventViewController *viewController = [[SingleEventViewController alloc] initWithEvent:[currentEvents objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

Ensuite, si un bouton est enfoncé dans SingleEventViewController, je l'appelle:

EventMapView* viewController = [[EventMapView alloc] initWithCoordinates];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];

Donc oui, il est évident qu'il y a imbriquée pousser des animations, mais n'est-ce pas la bonne façon d'aller à ce sujet? J'ai vérifié Apple DrillDownSave code et cela semble être la façon dont ils le font. Importe-t-il que je l'init méthodes à la place de viewDidLoad méthodes?

119voto

S B Points 2365

Appeler pushViewController avant viewDidAppear est dangereux.

93voto

user1927446 Points 948

ACCIDENTELLEMENT LE DÉCLENCHEMENT DE LA MÊME ENCHAÎNER DEUX FOIS Une fois dans le code, et une fois de interface builder, mais les deux en même temps...

J'avais la même erreur que le reste d'entre vous. Seulement mon problème est que j'étais accidentellement la cuisson de la même séquence, à deux reprises. Une fois à partir de l'interface builder, et une fois de l'intérieur de mon code.

J'ai un UITableView. Lorsqu'une cellule est sélectionnée, un segue dans interface builder incendies. Voilà mon problème, j'ai eu la segue mis en place pour être directement tiré en cliquant sur la CELLULE elle-Même, à l'intérieur d'interface builder, puis dans mon code, j'avais sous didSelectRowAtIndexPath, le code de feu que même segue... comme si...

[self performSegueWithIdentifier:@"MySegue" sender:tableView];

Cela signifie que lorsque didSelectRowAtIndexPath est appelée, parce qu'une ligne a été sélectionné, il déclenche la séquence avec l'-dessus de la ligne de code. Ensuite, interface builder, déclenche également la séquence, parce que son directement connecté à la cellule de l'objet dans interface builder. Pour arrêter interface builder directement à partir de la séquence de tir. Vous devez connecter la séquence à partir du haut de la vue-contrôleur, pas imbriquée à l'intérieur de la cellule elle-même.

Donc, si vous rencontrez ce problème, pour la même raison que moi, qui est, vous appelez la même enchaîner deux fois, vous pouvez résoudre ce problème par la dissociation de la liaison de la CELLULE DIRECTEMENT, à votre segue, et ayant la séquence de connexion partent du haut de la hiérarchie de l'IB, plutôt que de imbriquée à l'intérieur de la cellule. Connecter la séquence de vous Afficher le Contrôleur lui-même, à la séquence. Si vous avez fait cela correct, lorsque vous sélectionnez la séquence, il doit mettre en évidence la TOTALITÉ de la vue, il est à venir, et non seulement la cellule.

Maintenant Pommes états de documentation ainsi, en vertu de la performSegueWithIdentifier:expéditeur: référence:

Apps normalement n'ont pas besoin de déclencher enchaîne directement. Au lieu de cela, vous configurez un objet dans Interface Builder associés avec la vue du contrôleur, tel qu'un contrôle incorporé dans son point de vue de la hiérarchie, pour déclencher la séquence. Cependant, vous pouvez appeler cette méthode pour déclencher une séquence de la programmation, peut-être en réponse à une action qui ne peut pas être spécifié dans la table de montage séquentiel fichier de ressources. Par exemple, vous pouvez appeler à partir d'une action personnalisée gestionnaire utilisé pour traiter secouer ou des événements d'accéléromètre.

Dans mon cas, j'ai un bouton de recherche pour mon UITableView, et si la séquence est appelée lorsque le tableau des résultats de recherche est présent, ou la table normal, devait être déterminé. J'ai donc nécessaire pour déclencher la séquence directement.

Donc, supprimer le contrôle embarqué à partir de l'interface builder, et il suffit de coller sur le point de vue du contrôleur lui-même, puis de déclencher la séquence dans votre code!

Maintenant, plus de double enchaîne! Et plus d'erreurs.

Hope qui aide, m'a bien fallu quelques heures pour s'attaquer à celui-ci.

12voto

code007 Points 1588

J’ai eu le même problème / message d’erreur que vous avez fait tout à l’heure, était à la recherche d’une solution et fini pour moi à ce sujet, cependant, j’ai trouvé que la solution est d’avoir en fait qu’une seule animation : Oui, lorsque vous faites un push imbriqué (j’ai mis d’animation : Oui uniquement pour l’assaut final), espère que cette aide

à votre santé.

10voto

joshholat Points 1363

J’ai pensé à elle. Apparemment si vous appelez - pushViewController de l’extérieur de la méthode - didSelectRowAtIndexPath d’un UITableViewDelegate, il ne fonctionne pas. Travaillé en pénétrant l’appel de cette fonction. Bizarre.

8voto

Javy Points 4827

Je suis tombé sur ce même problème qui résulte d’un bouton dans une plume étant connecté à deux actions différentes. Il a essayé de charger les deux contrôleurs de la vue, altérant ainsi la pile.

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