J'ai une question concernant les deux methods mentionnées, car dans mes tests je ne précise pas l'ordre dans lequel elles sont appelées. J'ai pensé que, premièrement, viewDidLoad
est appelé quand le viewController est chargé pour la première fois (comme son nom l'indique), et immédiatement après la méthode init. Ensuite, j'ai pensé qu'une fois que viewDidLoad
returnne, viewWillAppear
est appelée. Si vous affichez un autre viewController, puis que vous revenez à celui-ci, il doit être déjà chargé et seul viewWillAppear
sera appelé.
Cependant, en cours de développement, je donne l'printing qu'il n'y a pas d'ordre lors de l'appel de viewDidLoad
et viewWillAppear
… Je n'ai pas trouvé de description claire de ce cycle de vie dans la documentation d'Apple, comment cela fonctionne-t-il?
Merci!
Je voudrais append à la réponse de Caleb: Ne confondez pas le controller de vue et la vue! Le nom viewDidLoad
indique clairement que la méthode est invoquée après le chargement de la vue . C'est le controller de vue qui effectue le chargement.
Quelques pointeurs concernant le cycle de vie des vues et l'ordre dans lequel les messages sont envoyés:
UIViewController
. loadView
et viewDidLoad
, également en conjonction avec les storyboards. viewWillAppear:
et al) Je m'arrête ici. Vous pouvez find plus de choses vous-même en recherchant "cycle de vie uiviewcontroller".
-viewDidLoad
est appelée lorsque le controller charge sa vue, ce qui n'est pas nécessairement juste après l'initialisation. Les controllers View ne chargent pas leurs vues tant qu'ils n'en ont pas besoin, que ce soit pour l'affichage ou pour toute autre raison.
-viewWillAppear
est appelée juste avant l'affichage de la vue. Ce sera après -viewDidLoad
, mais vous ne savez pas exactement combien de time après. -viewWillAppear
est appelée à chaque fois que la vue est affichée; -viewDidLoad
ne sera appelée qu'une seconde fois si la vue est déchargée à un moment donné (par exemple, didReceiveMemoryWarning ). Ces jours-ci c'est inhabituel, mais ça peut arriver.
Ou si le viewController est défini sur nil
, ce qui peut généralement arriver si un controller de vue est expulsé de la stack de navigation, la prochaine fois qu'il est amené à la stack de navigation, il doit appeler à nouveau -viewDidLoad
.
Je pensais que, d'abord, viewDidLoad est appelé lorsque le viewController est chargé pour la première fois (comme son nom l'indique), et immédiatement après la méthode init
Non. Le nom indique que la view
du controller a été chargée (pas le controller lui-même). En fait, les docs déclarent que cette méthode sera appelée après que la hiérarchie de vue a été chargée en memory (soit via loadView
ou via une plume par exemple).
Ensuite, j'ai pensé qu'une fois que viewDidLoad returnne, viewWillAppear est appelé
Encore une fois, non. loadView
(et par conséquent viewDidLoad
) sera appelée la première fois que la propriété view
sera accessible et est nil
(ce qui est le cas lorsque vous initialisez un controller). Pensez à ce scénario simple:
MyViewController *vc = [[MyViewController alloc] init]; UIView *view = vc.view; // <= loadView & viewDidLoad will fire but it certainly didn't appear...
Cependant, tout en développant je fais l'printing qu'il n'y a pas d'ordre lors de l'appel de viewDidLoad et viewWillAppear …
Eh bien, il y a un ordre. Nous soaps avec certitude que viewWillAppear
sera toujours appelé après viewDidLoad
(si les deux doivent être appelés bien sûr).
Comme vous l'avez dit, ViewDidLoad n'appelle qu'une seule fois après le chargement de la vue. Nous pouvons donc initialiser les instances dans viewDidLoad . Il est principalement destiné à l'initialisation.
viewWillAppear invoquera chaque fois que nous atteindrons cette vue. Donc, s'il y a des changements dans l'interface user, nous pouvons le faire dans viewWillAppear .
J'ai couru une trace sur quand tous ces appels sont faits: http://thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace