Différence entre viewDidLoad et viewDidAppear

Réponses:

147

viewDidLoadest appelé exactement une fois, lorsque le contrôleur de vue est chargé pour la première fois en mémoire. C'est ici que vous souhaitez instancier les variables d'instance et créer toutes les vues qui durent pendant tout le cycle de vie de ce contrôleur de vue. Cependant, la vue n'est généralement pas encore visible à ce stade.

viewDidAppearest appelée lorsque la vue est réellement visible et peut être appelée plusieurs fois au cours du cycle de vie d'un contrôleur de vue (par exemple, lorsqu'un contrôleur de vue modale est fermé et que la vue redevient visible). C'est là que vous souhaitez effectuer des actions de mise en page ou faire n'importe quel dessin dans l'interface utilisateur - par exemple, présenter un contrôleur de vue modale. Cependant, tout ce que vous faites ici doit être reproductible. Il est préférable de ne pas conserver les choses ici, sinon vous aurez des fuites de mémoire si vous ne les relâchez pas lorsque la vue disparaît.

Voir: https://developer.apple.com/documentation/uikit/uiviewcontroller

Davidgoli
la source
15
Vous et WrightsCS avez absolument raison. Mais, pas pour couper les cheveux, mais alors que ce viewDidLoadn'est généralement appelé qu'une seule fois, il existe une situation où il peut être appelé à nouveau. Plus précisément, si jamais vous recevez un didReceiveMemoryWarning, vos vues non visibles peuvent être libérées (bien que les contrôleurs de vue ne soient pas touchés) et lorsque vous revenez, elles viewDidLoadpeuvent être appelées à nouveau.
Rob
1
Je ne sais pas si je suis d'accord avec le commentaire sur la libération permanente et automatique des ivars de view controller (le contrôleur lui-même n'est pas publié). Je soupçonne que nous pourrions tous les deux facilement construire un viewDidLoad qui fuirait s'il était ré-invoqué après un didReceiveMemoryWarning. Mais je suis d'accord que si vous utilisez de bonnes pratiques lors de la rédaction de votre viewDidLoad, tout devrait aller bien. Mon seul point est qu'une utilisation bâclée des ivars et de la gestion manuelle de la mémoire peut certainement entraîner des fuites viewDidLoad. Les gens doivent être sensibles au didReceiveMemoryWarningscénario et programmer en conséquence.
Rob
2
Pour ne pas insister sur le sujet, mais moins de 24 heures après cet échange, tout en répondant à une autre question , j'ai trouvé un exemple précis du type de viewDidLoadcode sur lequel fuirait didReceiveMemoryWarning. Soupir.
Rob
1
Cette réponse contredit directement cette autre: stackoverflow.com/a/3411636/269753 J'ai observé que ma méthode viewDidLoad était appelée plus d'une fois, même si je ne recevais pas du tout d'avertissement de mémoire. Quelqu'un veut clarifier?
Ricardo Sanchez-Saez
2
Je ne vois pas qu'il y ait une contradiction. Cette question concerne la relation entre viewDidLoad et viewDidUnload, et non viewDidAppear.
davidgoli
21

En termes simples, vous voudrez créer des contrôles ou des tableaux dans viewDidLoad, où comme dans viewDidAppearest l'endroit où vous souhaitez actualiser ces contrôles ou tableaux.

viewDidLoadest appelé une fois lorsque le contrôleur est créé et viewDidAppearest appelé chaque fois que la vue, eh bien, DID apparaît. Supposons que vous ayez une vue modale que vous présentez, lorsque cette vue est rejetée, viewDidAppearelle sera appelée et viewDidLoadne sera pas appelée.

WrightsCS
la source
3
Le premier paragraphe est un bon conseil. Mais le deuxième paragraphe est incorrect. viewDidLoadpeut être appelé plus d'une fois . Si votre vue alors qu'elle n'est pas affichée (sous une pile d'autres vues) est déchargée par les anciennes versions d'iOS dans une situation de mémoire insuffisante, alors le contrôleur de vue rechargera automatiquement la vue après avoir besoin d'être ré-affichée à l'écran. Dans les versions ultérieures d'iOS, vous pouvez choisir d'aider à réduire l'utilisation de la mémoire en faisant ce qu'iOS antérieur faisait pour vous: Déchargez les vues hors écran lorsque le didReceiveMemoryWarningmessage arrive, auquel cas le viewDidLoadsera à nouveau appelé.
Basil Bourque
@WrightsCS avez-vous un document officiel Apple qui dit cela? "viewDidLoad est appelé une fois lorsque le contrôleur est créé" Parce que je me souviens que dans le passé, viewDidLoad pouvait être appelé plusieurs fois dans des scénarios de mémoire insuffisante. Merci beaucoup.
Ricardo