118 votes

iPhone viewWillAppear ne se déclenche pas

J'ai lu de nombreux messages concernant des personnes ayant des problèmes avec viewWillAppear lorsque vous ne créez pas votre hiérarchie de vues juste C'est vrai. Mon problème est que je n'arrive pas à comprendre ce que ça veut dire.

Si je crée un RootViewController et appeler addSubView sur ce contrôleur, je m'attendrais à ce que la ou les vues ajoutées soient câblées pour viewWillAppear événements.

Quelqu'un a-t-il un exemple d'une hiérarchie de vue programmatique complexe qui reçoit avec succès viewWillAppear des événements à tous les niveaux ?

L'état des docs d'Apple :

Avertissement : Si la vue appartenant à un contrôleur de vues est ajoutée directement à une hiérarchie de vues, le contrôleur de vues ne recevra pas ce message. Si vous insérez ou ajoutez une vue à la hiérarchie des vues, et qu'elle possède un contrôleur de vues, vous devez envoyer ce message directement au contrôleur de vues associé. Si vous n'envoyez pas ce message au contrôleur de vue, toute animation associée ne pourra pas être affichée.

Le problème est qu'ils ne décrivent pas comment le faire. Que signifie "directement" ? Comment ajoute-t-on "indirectement" une vue ?

Je suis assez novice en matière de Cocoa et d'iPhone et ce serait bien s'il y avait des exemples utiles d'Apple en dehors des conneries basiques de Hello World.

0 votes

J'ai eu ce problème jusqu'à ce que je réalise que je comprenais mal l'utilisation prévue des sous-classes UIViewController en général. Consultez cette question. stackoverflow.com/questions/5691226/

7 votes

Attention ! !! Ce n'est plus vrai sous iOS 5 ! !! Appelle viewWillAppear et viewDidAppear automatiquement

0 votes

Pour tous ceux qui viennent ici aujourd'hui et qui développent pour iOS 13+, faites défiler la page jusqu'à la réponse de Bilal qui traite spécifiquement de ce sujet.

56voto

mmalc Points 7663

Si vous utilisez un contrôleur de navigation et définissez son délégué, les méthodes view{Will,Did}{Appear,Disappear} ne sont pas invoquées.

Vous devez utiliser les méthodes de délégation du contrôleur de navigation à la place :

navigationController:willShowViewController:animated:
navigationController:didShowViewController:animated:

2 votes

Je n'avais pas défini le délégué de mon contrôleur de navigation et la méthode n'était toujours pas appelée. Quoi qu'il en soit, je l'ai défini et j'ai ensuite utilisé les méthodes que vous avez mentionnées ci-dessus. Merci.

0 votes

Je vois la même chose que Dimitris.

7 votes

Je viens de tester cela dans iOS4 et iOS5 : ce n'est PAS vrai : le fait de définir le délégué d'un navigationController puis d'y pousser une vue déclenchera viewWillAppear : etc.

28voto

lajos Points 13791

J'ai rencontré le même problème. Il suffit d'envoyer un viewWillAppear à votre contrôleur de vue avant de l'ajouter en tant que sous-vue. (Il y a un paramètre BOOL qui indique au contrôleur de vue s'il est animé pour apparaître ou non).

[myViewController viewWillAppear:NO];

Regardez le fichier RootViewController.m dans l'exemple Metronome.

(En fait, j'ai trouvé les projets d'exemple d'Apple excellents. Il y a BEAUCOUP plus que HelloWorld ;)

3 votes

En fait, vous devez appeler viewWillAppear après l'avoir ajouté à la sous-vue. Sinon, les IBOutlets/IBActions ne seront pas câblés.

2 votes

Oui, après. J'ai créé une sous-vue à partir de XIB, viewWillAppear n'a pas été appelé. Je l'ai appelé moi-même et tout fonctionne très bien.

0 votes

Merci ! C'était exactement ça pour moi. J'ajoutais manuellement une sous-vue via [scrollView addSubview:controller.view]; . J'ai ajouté la ligne [controller viewWillAppear:NO]; après et voilà ! Ça a marché comme sur des roulettes.

18voto

Chris Points 13472

J'ai enfin trouvé une solution qui fonctionne !

UINavigationControllerDelegate

Je pense que l'essentiel est de définir le délégué de votre contrôle de navigation sur le viewcontroller dans lequel il se trouve, et d'implémenter la méthode suivante UINavigationControllerDelegate et c'est deux méthodes. C'est génial ! Je suis tellement excité d'avoir enfin trouvé une solution !

0 votes

Comment assigner un contrôleur de vue racine comme délégué pour le contrôleur de navigation ?

1 votes

Cela ne fonctionne pas ! Essayez de minimiser l'application et de la maximiser.

9voto

Antoine Points 61

Je viens de rencontrer le même problème. Dans mon application, j'ai 2 contrôleurs de navigation et le fait de pousser le même contrôleur de vue dans chacun d'eux a fonctionné dans un cas et pas dans l'autre. Je veux dire que lorsque l'on pousse exactement le même contrôleur de vue dans le premier UINavigationController , viewWillAppear a été appelé mais pas lorsqu'il a été poussé dans le deuxième contrôleur de navigation.

Puis je suis tombé sur ce post UINavigationController doit appeler les méthodes viewWillAppear/viewWillDisappear.

Et j'ai réalisé que mon deuxième contrôleur de navigation a redéfini viewWillAppear . Le dépistage du code a montré que je n'appelais pas

[super viewWillAppear:animated];

Je l'ai ajouté et ça a marché !

La documentation dit :

Si vous surchargez cette méthode, vous devez appeler super à un moment donné dans votre implémentation.

0 votes

Même chose ici. Je me suis trompé en n'appelant pas le concierge.

5voto

Josh Gagnon Points 2264

J'utilise un contrôleur de navigation. Lorsque je veux soit descendre à un autre niveau de données, soit afficher ma vue personnalisée, j'utilise ce qui suit :

[self.navigationController pushViewController:<view> animated:<BOOL>];

Lorsque je fais cela, j'obtiens le viewWillAppear à déclencher. Je suppose que cela est qualifié d'"indirect" parce que je n'appelle pas la fonction réelle addSubView moi-même. Je ne sais pas si cela s'applique à 100% à votre application puisque je ne peux pas dire si vous utilisez un contrôleur de navigation, mais peut-être que cela vous donnera un indice.

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