7
votes

Temps correct pour appeler le viewDidAppear manuellement?

J'ai un UitailViewController dans mon application, qui est ajouté à la hiérarchie de vue directement. Une fois la vue apparaît, je veux faire défiler jusqu'à une cellule spécifique. Ma solution consisterait à appeler le code de défilement dans - [viewDidIDAppear] .

Selon les documents d'Apple, je dois appeler la méthode manuellement:

Si l'affichage appartenant à un contrôleur d'affichage est ajouté à une hiérarchie d'affichage directement, le contrôleur d'affichage ne recevra pas ce message. Si vous insérez ou ajoutez une vue à la hiérarchie de la vue, vous devez envoyer le contrôleur de vue associé à ce message directement.

La question est la suivante: quand est le bon moment pour l'appeler manuellement?

l'appelant à partir du contrôleur d'affichage du parent - [ViewDidAppappear] mène à un crash lorsque j'essaie de faire défiler des défilements car apparemment, la vue de table n'a pas encore apparaissent et pense donc qu'il n'a pas de sections à faire défiler.


0 commentaires

4 Réponses :


0
votes

L'appelant du contrôleur parent -ViewDidAppEar est généralement votre meilleur pari.

Si cela entraîne des problèmes si le contrôleur de la vue enfant n'est pas encore complètement initialisé, vous pouvez avoir un autre problème. Assurez-vous que votre contrôleur d'affichage de votre enfant est complètement "prêt à l'action" après -ViewWillappappear est appelé (que vous pouvez également appeler manuellement à partir du parent -Viewillappear )


2 commentaires

Vous ne devriez absolument jamais appeler ces événements de cycle de vie directement


Si votre contrôleur de vue n'est pas dans le contrôleur de la racine, Heirachy, les événements de cycle de vie ne seront jamais appelés, vous devez donc absolument les appeler manuellement si vous souhaitez les utiliser. Ils sont juste une fonction, pas l'homme de boogie.



1
votes

in - [ViewDididappear] sur la vision de la vue, appelé en effet du contrôleur de la vue parent - [ViewDidAppear], vous pouvez appeler [TableView reloaddata], de cette façon, vous vous assurez que la vision de la table est chargée et prête.


0 commentaires

0
votes

C'est comme ça que j'appelle manuellement ViewWillappear , ViewDidAppear , ViewWilldisappear , ViewDidDisappear : Pe

et l'un des contrôleurs d'affichage I Chargez de cette façon, a le suivant ViewWillappear: (Notez que c'est < Code> ViewWillappear car au point que ViewDidAppear est appelé, votre vue visible par l'utilisateur) xxx


0 commentaires

18
votes

Si vous utilisez le confinement du contrôleur d'affichage, n'appelez pas ViewWillappear: directement. Utilisez plutôt - BegAppAreAranceRansition: animé: et - EndappeAranceTransition .

Si vous implémentez un contrôleur de conteneur personnalisé, utilisez cette méthode pour dire à l'enfant que ses vues sont sur le point d'apparaître ou de disparaître. N'inquister pas ViewWillappear:, ViewWilldisappear:, ViewDididAppear :, ou ViewDidDisappear: directement.

appeler addsubview déclenchera automatiquement ViewWillappear: et ViewDidAppear: Si la vue ViewController est un contrôleur de vue enfant, appelez donc ViewWillappear: directement La vue de déclenchement sera la méthode d'apparence deux fois. Utilisation de TewePapperAranceTransition: Animé: et - EndappeAranceTransition` supprimera le comportement automatique afin que vous ne l'appeliez qu'une seule fois.


1 commentaires

Merci mon ami, après avoir passé une journée entière pour un bug, votre réponse a sauvé ma journée