Pourriez-vous m'expliquer la bonne façon de gérer le UIViewController
cycle de vie?
En particulier, je voudrais savoir comment utiliser Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
et Dispose
méthodes Mono tactile pour une UIViewController
classe.
ios
uiviewcontroller
xamarin.ios
lifecycle
Lorenzo B
la source
la source
Réponses:
Toutes ces commandes sont appelées automatiquement aux moments appropriés par iOS lorsque vous chargez / présentez / masquez le contrôleur de vue. Il est important de noter que ces méthodes sont attachées à elles-mêmes
UIViewController
et non àUIView
elles-mêmes. Vous n'obtiendrez aucune de ces fonctionnalités en utilisant simplement aUIView
.Il y a une excellente documentation sur le site d'Apple ici . Mettre tout simplement si:
ViewDidLoad
- Appelé lorsque vous créez la classe et chargez à partir de xib. Idéal pour la configuration initiale et le travail ponctuel.ViewWillAppear
- Appelé juste avant l'affichage de votre vue, idéal pour masquer / afficher des champs ou toute opération que vous souhaitez effectuer à chaque fois avant que la vue ne soit visible. Étant donné que vous pouvez faire des allers-retours entre les vues, cela sera appelé chaque fois que votre vue est sur le point d'apparaître à l'écran.ViewDidAppear
- Appelé après l'affichage de la vue - endroit idéal pour démarrer une animation ou le chargement de données externes à partir d'une API.ViewWillDisappear
/DidDisappear
- Même idée queViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- Dans Objective-C, c'est là que vous effectuez votre nettoyage et la sortie des trucs, mais cela est géré automatiquement, donc pas grand-chose à faire ici.la source
MISE À JOUR: ViewDidUnload a été déconseillé dans iOS 6, donc mis à jour la réponse en conséquence.
Le cycle de vie d'UIViewController est schématisé ici:
L'avantage d'utiliser Xamarin Native / Mono Touch, c'est qu'il utilise les API natives, et il suit donc le même cycle de vie de ViewController que vous trouveriez dans la documentation d'Apple.
la source
Il s'agit des dernières versions d'iOS (modifiées avec Xcode 9.3, Swift 4.1 ). Voici toutes les étapes qui rendent le cycle de vie
UIViewController
complet.loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
Permettez-moi d'expliquer toutes ces étapes.
1.
loadView
Cet événement crée / charge la vue gérée par le contrôleur. Il peut se charger à partir d'un fichier nib associé ou d'un vide
UIView
si null a été trouvé. Cela en fait un bon endroit pour créer vos vues dans le code par programme.2.
loadViewIfNeeded
Si au cas où la vue du courant
viewController
n'a pas encore été définie, cette méthode chargera la vue, mais rappelez-vous, cela n'est disponible que dans iOS> = 9.0. Donc, si vous prenez en charge iOS <9.0, ne vous attendez pas à ce qu'il apparaisse dans l'image.3.
viewDidLoad
L'
viewDidLoad
événement n'est appelé que lorsque la vue est créée et chargée en mémoire, mais les limites de la vue ne sont pas encore définies. C'est un bon endroit pour initialiser les objets que le contrôleur de vue va utiliser.4.
viewWillAppear
Cet événement avertit
viewController
chaque fois que la vue apparaît à l'écran. Dans cette étape, la vue a des limites qui sont définies mais l'orientation n'est pas définie.5.
viewWillLayoutSubviews
Il s'agit de la première étape du cycle de vie où les limites sont finalisées. Si vous n'utilisez pas de contraintes ou de disposition automatique, vous souhaiterez probablement mettre à jour les sous-vues ici. Ceci est uniquement disponible dans iOS> = 5.0. Donc, si vous prenez en charge iOS <5.0, ne vous attendez pas à ce qu'il apparaisse dans l'image.
6.
viewDidLayoutSubviews
Cet événement informe le contrôleur de vue que les sous-vues ont été configurées. C'est un bon endroit pour apporter des modifications aux sous-vues une fois qu'elles ont été définies. Ceci est uniquement disponible dans iOS> = 5.0. Donc, si vous prenez en charge iOS <5.0, ne vous attendez pas à ce qu'il apparaisse dans l'image.
7.
viewDidAppear
L'
viewDidAppear
événement se déclenche après la présentation de la vue à l'écran. Ce qui en fait un bon endroit pour obtenir des données d'un service backend ou d'une base de données.8.
viewWillDisappear
L'
viewWillDisappear
événement se déclenche lorsque la vue présentéeviewController
est sur le point de disparaître, de disparaître, de se couvrir ou de se cacher derrière l'autreviewController
. C'est un bon endroit où vous pouvez restreindre vos appels réseau, invalider le minuteur ou libérer des objets qui y sont liésviewController
.9.
viewDidDisappear
Il s'agit de la dernière étape du cycle de vie à laquelle tout le monde peut s'attaquer, car cet événement se déclenche juste après que la vue présentée
viewController
a disparu, rejetée, couverte ou masquée.Maintenant, selon Apple, lorsque vous implémentez ces méthodes, vous devez vous rappeler d'appeler l'
super
implémentation de cette méthode spécifique.J'espère que cela vous a aidé. Merci.
MISE À JOUR - Comme @ThomasW l'a souligné à l'intérieur du commentaire
viewWillLayoutSubviews
etviewDidLayoutSubviews
sera également appelé à d'autres moments lorsque des sous-vues de la vue principale sont chargées, par exemple lorsque des cellules d'une vue de table ou d'une vue de collection sont chargées.MISE À JOUR - Comme @Maria l'a souligné dans le commentaire, la description de a
loadView
été mise à jourla source
viewWillLayoutSubviews
etviewDidLayoutSubviews
sera également appelée à d'autres moments lorsque des sous-vues de la vue principale sont chargées, par exemple lorsque des cellules d'une vue de table ou d'une vue de collection sont chargées.viewWillAppear
viewDidAppear
viewDidDisappear
. Vous devez appeler super à un moment donné.iOS 10,11 (Swift 3.1, Swift 4.0)
Selon
UIViewController
dans lesUIKit
développeurs,1. loadView ()
C'est là que les sous-classes doivent créer leur hiérarchie de vue personnalisée si elles n'utilisent pas de plume . Ne devrait jamais être appelé directement.
2. loadViewIfNeeded ()
Charge la vue du contrôleur de vue si elle n'a pas déjà été définie.
3. viewDidLoad ()
Appelé après le chargement de la vue. Pour les contrôleurs de vue créés dans le code, c'est après -loadView. Pour les contrôleurs de vue non archivés à partir d'une pointe, c'est après que la vue est définie.
4. viewWillAppear (_ animé: Bool)
Appelé lorsque la vue est sur le point d'être rendue visible. La valeur par défaut ne fait rien
5. viewWillLayoutSubviews ()
Appelé juste avant l'appel de la méthode layoutSubviews du contrôleur de vue. Les sous-classes peuvent être implémentées si nécessaire. La valeur par défaut ne fait rien.
6. viewDidLayoutSubviews ()
Appelé juste après l'appel de la méthode layoutSubviews du contrôleur de vue. Les sous-classes peuvent être implémentées si nécessaire. La valeur par défaut ne fait rien.
7. viewDidAppear (_ animé: Bool)
Appelé lorsque la vue a été entièrement transférée sur l'écran. La valeur par défaut ne fait rien
8. viewWillDisappear (_ animé: Bool)
Appelé lorsque la vue est rejetée, couverte ou autrement masquée. La valeur par défaut ne fait rien
9. viewDidDisappear (_ animé: Bool )
Appelé après que la vue a été rejetée, couverte ou autrement cachée. La valeur par défaut ne fait rien
10. viewWillTransition (à la taille: CGSize, avec le coordinateur: UIViewControllerTransitionCoordinator)
Appelé lorsque la vue est en transition.
11. willMove (au parent de ParentViewController: UIViewController?)
12. didMove (au parent de ParentViewController: UIViewController?)
Ces deux méthodes sont publiques pour les sous-classes de conteneurs à appeler lors de la transition entre les contrôleurs enfants. S'ils sont remplacés, les remplacements doivent garantir d'appeler le super.
L'argument parent dans ces deux méthodes est nul lorsqu'un enfant est retiré de son parent; sinon, il est égal au nouveau contrôleur de vue parent.
13. didReceiveMemoryWarning ()
Appelé lorsque l'application parent reçoit un avertissement de mémoire. Sur iOS 6.0, il ne supprimera plus la vue par défaut.
la source
nib
tel que mentionné ci-dessousloadView
?viewWillLayoutSubviews()
est appelé avant que l'objet de vue du ViewController n'invoque salayoutSubviews()
méthodeÀ partir d'iOS 6 et versions ultérieures. Le nouveau diagramme est le suivant:
la source
Concentrons-nous sur les méthodes, responsables du cycle de vie de UIViewController :
Création:
- (void)init
- (void)initWithNibName:
Création de vue:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Gestion du changement d'état de la vue:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Gestion des avertissements de mémoire:
- (void)didReceiveMemoryWarning
Désallocation
- (void)viewDidUnload
- (void)dealloc
Pour plus d'informations, consultez la référence de classe UIViewController .
la source
Les méthodes
viewWillLayoutSubviews
etviewDidLayoutSubviews
ne sont pas mentionnées dans les diagrammes, mais elles sont appelées entreviewWillAppear
etviewDidAppear
. Ils peuvent être appelés plusieurs fois.la source
La réponse de Haider est correcte pour la version antérieure à iOS 6. Cependant, depuis iOS 6, viewDidUnload et viewWillUnload ne sont jamais appelés. Les documents indiquent: "Les vues ne sont plus purgées dans des conditions de faible mémoire et cette méthode n'est donc jamais appelée."
la source
Il y a beaucoup d'informations obsolètes et incomplètes ici. Pour iOS 6 et versions ultérieures uniquement:
loadView
[une]viewDidLoad
[une]viewWillAppear
viewWillLayoutSubviews
est la première fois que les limites sont finaliséesviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]Notes de bas de page:
(a) - Si vous supprimez manuellement votre vue pendant
didReceiveMemoryWarning
,loadView
etviewDidLoad
sera rappelé. C'est-à-dire par défautloadView
etviewDidLoad
n'est appelé qu'une seule fois par instance de contrôleur de vue.(b) Peut être appelé 0 fois ou plus.
la source
viewWillLayoutSubviews
etviewDidLayoutSubviews
sera également appelée à d'autres moments lorsque des sous-vues de la vue principale sont chargées, par exemple lorsque des cellules d'une vue de table ou d'une vue de collection sont chargées.Expliquer les transitions d'états dans le document officiel: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Cette image montre les transitions d'état valides entre les différentes méthodes de rappel «volonté» et «did»
Transitions d'état valides:
Tiré de: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png
la source
Selon le document d'Apple - Commencer à développer des applications iOS (Swift) - Travailler avec les contrôleurs de vue - Comprendre le cycle de vie du contrôleur de vue
la source