Il y a beaucoup de choses qui se passent dans les coulisses avec Gestion des vues et des viewController en Cocoa .
1. L'objet viewController
Dans sa forme la plus simple, un viewController est un objet contrôleur générique. Lorsqu'il est alloué et initialisé pour la première fois, aucun objet de vue ne lui est associé. La vue n'est instanciée que lorsque (et si) elle est requise. Ainsi, sans tenir compte de la vue, le cycle de vie d'un viewController est le même que celui de tout autre objet :
UIViewController * myVC = [[UIViewController alloc] initWith...];
...
[myVC release];
L'initialisateur désigné pour les viewControllers est -initWithNibname:bundle:
. Si vous spécifiez un nib, le viewController peut automatiquement charger sa vue à partir de ce nib et connecter les IBOutlets que vous avez définis (voir ci-dessous pour plus de détails).
2. Chargement et déchargement de la vue
Un viewController chargera sa vue selon les besoins. Cela se produit généralement lorsque le -view
est appelée pour la première fois, et peut se produire à n'importe quel moment dans votre programme, selon la façon dont vous initialisez votre interface utilisateur. La vue peut également être détruite et rechargée plusieurs fois au cours de la durée de vie de votre programme, toujours en fonction de la façon dont vous gérez votre interface utilisateur. Lorsque le viewController a identifié que sa vue est nécessaire mais n'est pas encore chargée, la fonction -loadView
sera appelée. Le flux de messages de base ressemble à ceci :
view
loadView
viewDidLoad
Notez que si vous remplacez l'option -view
méthode, -loadView
et viewDidLoad
ne sera pas appelé automatiquement. Si vous remplacez -loadView
vous doit définissent les paramètres du viewController view
propriété. Sinon, le prochain appel à -view
déclenchera à nouveau le processus de chargement.
La vue peut également être déchargée à tout moment pendant la durée de vie de votre programme, en définissant simplement l'attribut view
à la propriété nil
. L'implémentation par défaut de -didReceiveMemoryWarning
le fera automatiquement, tant que la vue n'a pas de vue supérieure (c'est-à-dire si elle ne fait pas partie de la hiérarchie des vues actives). Le flux de messages est le suivant :
view = nil
viewDidUnload
2a. Chargement programmé de la vue
Si vous choisissez d'ignorer -loadView
Dans le cadre d'un projet, vous pouvez créer une vue, des sous-vues, d'autres viewControllers et toutes les connexions entre ces objets de la manière qui vous convient. Bien entendu, cela signifie que vous êtes également responsable de la gestion de la mémoire pour les objets que vous créez. Si votre sous-classe surcharge -loadView
il doit être initialisé en utilisant nil
pour les deux nibName
et bundle
.
2b. Chargement de la vue à partir d'une plume
Si vous utilisez un fichier nib, l'implémentation par défaut de la fonction -loadView
ouvrira automatiquement ce fichier nib, instanciera ses objets, ajoutera toutes les connexions entre eux et s'occupera de la gestion de la mémoire pour vous.
Les choses sont un peu plus délicates avec les fichiers nib, car il se passe beaucoup de choses en coulisse. Le site -awakeFromNib
est appelée pour tout objet qui est instancié lorsqu'un fichier nib est chargé, et il n'y a aucune garantie que les autres objets du fichier nib auront été entièrement chargés lorsqu'il est appelé.
3. Affichage des vues
-viewWillAppear:
, -viewDidAppear:
, -viewWillDisappear:
et -viewDidDisappear:
ne sont appelées que lorsque la vue est affichée ou masquée à l'écran, notamment lors des transitions animées d'une vue à l'autre. Ces méthodes peuvent être appelées de nombreuses fois pendant la durée de vie de votre programme, au fur et à mesure que les vues sont échangées dans votre schéma de navigation.
4. Afficher la mise en page
Le site -layoutSubviews
La méthode est pas partie de UIViewController
. Il s'agit de UIView
lorsque leurs limites ont été modifiées. Si vous utilisez un UIView
dans votre programme, cette méthode peut être utilisée pour réaliser une mise en page personnalisée des vues secondaires au lieu de s'appuyer sur les méthodes de redimensionnement automatique par défaut de Cocoa.
5. Tout mettre en place
En raison de sa complexité, ce processus peut se dérouler de nombreuses façons différentes, mais une chronologie normale pourrait ressembler à ceci :
-[viewController initWithNibname:Bundle:]
-[viewController awakeFromNib]
-[viewController loadView]
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear] // user navigated away
-[viewController viewDidDisappear]
...
-[viewController viewWillAppear] // user navigated back
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear] // user navigated away
-[viewController viewDidDisappear]
...
-[viewController setView:nil] // memory warning, perhaps
-[viewController viewDidUnload]
...
-[viewController loadView] // user navigated back
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...