viewDidAppear appelé deux fois sur la même instance, mais seulement la première fois que cette charge de la catégorie forme de PLUME
J'ai une manette de navigation. L'un des points de vue ajoute personnalisé des sous-vues dans son viewDidAppear:
. Je remarque que la première fois que je navigue à une instance de ce point de vue contrôleur après le lancement de l'application, viewDidAppear:
appelle deux fois. Si je pop ce point de vue en dehors de la pile et de naviguer à nouveau, viewDidAppear:
appelle qu'une seule fois par l'apparence. Toutes les apparitions ultérieures invoquer viewDidAppear:
une fois.
Le problème pour moi est que la première fois que je reçois de ce point de vue, je me retrouve avec deux fois le nombre de sous-vues. Je contourner ce problème en introduisant une variable d'indicateur ou quelque chose comme ça, mais je voudrais comprendre ce qui se passe et comment puis-je obtenir deux invocations dans ces circonstances.
OriginalL'auteur iter | 2010-07-07
Vous devez vous connecter pour publier un commentaire.
Vous ne devez jamais compter sur
-viewWillAppear:
/-viewDidAppear:
être appelé un équilibre avec l'disparaître variantes. Alors que le système de vue contrôleurs de faire du mieux qu'ils peuvent toujours support les appels correctement, je ne sais pas si elles l'ont jamais garantie, et surtout lors de l'utilisation de l'affichage personnalisé des contrôleurs, vous pouvez trouver des situations où il peut être appelée plusieurs fois.En bref, votre
-viewWillAppear:
/-viewDidAppear:
méthodes doivent être idempotent, de sens que si-viewDidAppear:
est appelé deux fois dans une rangée sur votre contrôleur, il doit se comporter correctement. Si vous souhaitez charger des vues personnalisées, vous pouvez le faire en-viewDidLoad
à la place, et puis il suffit de mettre à l'écran (si elles ne le sont pas déjà) dans-viewDidAppear:
.Vous pouvez aussi mettre un point d'arrêt dans votre
-viewDidAppear:
méthode pour voir pourquoi il est appelé deux fois, la première fois qu'il se montre.viewDidAppear:
. Comment peut-il répondre à la question pourquoi?Regardez la trace de la pile, afin de savoir pourquoi le système est à l'appel de cette méthode. Si les traces sont différents pour les deux appels, vous pouvez l'utiliser pour tenter de comprendre ce qui se passe. Cela peut ou peut ne pas être utile, en fonction précisément ce qui est contenu dans la trace.
Les piles ont l'air identiques, d'où ma surprise à votre suggestion. Ma solution est de refactoriser le code pour que je puisse appeler le code dans
viewDidAppear:
indirectement deviewDidLoad:
, et afin d'éviter tout problème. Je suis de l'acceptation de votre réponse, même si la double invocation est encore un mystère pour moi.+1 pour l'utilisation du mot idempotent. Je n'ai pas encore fixé mon dupliqué viewDidAppear appelle encore, mais j'ai appris un nouveau mot!
Je ne le pense pas, mais plus important encore, il n'y a pas de documentation en disant qu'ils sont garantis pour être équilibré. Et un mal écrit tiers VC peut assez facilement déséquilibré.
OriginalL'auteur
peut-être que vous appelez
viewDidAppear
dansviewDidLoad
(ou quelques autres trucs qui s'y passe), puisque c'est invoqué qu'une seule fois pendant le chargement de la vue à partir de la mémoire. Il serait de match, qu'il est invoqué à deux reprises seulement la première fois.viewDidAppear:
invocation, aucun de mes propres méthodes apparaissent en elle.OriginalL'auteur
Si vous avez une ligne comme ceci dans votre AppDelegate
assurez-vous que vous N'avez PAS de "Main nib nom de base du fichier de la propriété" dans votre plist mis à la Fenêtre".xib" ou quel que soit votre fenêtre sur mesure plume est nommé. Si vous le faites, supprimer cette ligne à partir de votre plist et assurez-vous de quelque chose comme
dans votre AppDelegate après l'instanciation de votre fenêtre. Dans la plupart des cas, vous pouvez supprimer en toute sécurité de la Fenêtre.xib.
OriginalL'auteur
Vous avez certainement devraient fournir plus d'informations.
Est-ce la vue de la racine de contrôleur?
Peut-être que vous lancez la manette de navigation avec cette vue de la racine de contrôleur de gestion, puis poussez la manette de navigation une fois de plus?
NSLog(@"%@", [[self navigationController] viewControllers]);
deviewDidAppear
et de voir un exemple de mon point de vue, assis sur le dessus de la vue racine.Peut-être que vous avez 2 manettes de navigation par erreur?
OriginalL'auteur
Une autre solution qui est peut-être votre cause sous-jacente: assurez-vous de ne pas présenter la toute nouvelle vue des contrôleurs de l'intérieur de votre
viewWillAppear:
méthode.Je appeler:
de l'intérieur
viewWillAppear
et voyant mon originaires de VCviewDidAppear:
méthode appelée deux fois successivement avec la même trace de la pile comme vous le mentionnez. Et pas d'intermédiaire appel àviewDidDisappear:
Déplacement
presentViewController:
à l'origine de la VCviewDidAppear:
méthode éclairci le double-appel en question, et donc le flux est:viewDidAppear:
appelépresentViewController
iciviewDidDisappear:
appelé"unbalanced VC display"
Fixe avec l'aide de cette réponse: https://stackoverflow.com/a/13315360/1143123 tout en essayant de résoudre
"Unbalanced calls to begin/end appearance transitions for ..."
OriginalL'auteur
Ce n'était pas un iOS 5 bug, mais caché le comportement de addChildViewController:. Je devrais le fichier radar pour le manque de documentation, je pense
https://github.com/defagos/CoconutKit/issues/4
OriginalL'auteur
Ajoutant
[super viewDidAppear:animated];
fonctionné pour moi:OriginalL'auteur
c'est un problème gênant, pensez-vous que ça fonctionne une fois, mais ensuite, j'ai maintenant trouvé à propos de ce qui est à l'origine de mayhem... Cela s'applique à tous les 3 (ViewDidAppear, ViewDidLoad, et ViewWillAppear), je suis présent lors de l'intégration avec un terminal de paiement; une fois terminer l'appel à l'API, la fenêtre est en train d'être chargé lorsqu'il est déjà à l'écran et tout, c'est la mémoire est toujours là (non conservé).
J'ai résolu ce problème en procédant comme suit pour toutes les routines mentionné ci-dessus, ci-dessous est un échantillon de l'un d'entre eux:
Répéter l'opération pour tous les autres deux, cela l'empêche de courir deux fois. Cela n'a jamais eu lieu avant que Steve Jobs est mort !!!
Cordialement
Heider Sati
OriginalL'auteur