web-dev-qa-db-fra.com

Chercher à comprendre le cycle de vie iOS UIViewController

Pourriez-vous m'expliquer la bonne manière de gérer le cycle de vie UIViewController?

J'aimerais en particulier savoir comment utiliser les méthodes Initialize, ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappear, ViewDidUnload et Dispose dans Mono Touch pour une classe UIViewController.

249
Lorenzo B

Toutes ces commandes sont appelées automatiquement aux moments appropriés par iOS lorsque vous chargez/présentez/cachez le contrôleur de vue. Il est important de noter que ces méthodes sont attachées à UIViewController et non à UIViews elles-mêmes. Vous n'obtiendrez aucune de ces fonctionnalités en utilisant simplement une UIView.

Il existe une excellente documentation sur le site d'Apple ici . Pour résumer simplement si:

  • ViewDidLoad - Appelé lorsque vous créez la classe et chargez-le à partir de xib. Idéal pour la configuration initiale et le travail ponctuel.

  • ViewWillAppear - Appelée juste avant l'affichage de votre vue, elle est utile pour masquer/afficher les champs ou toute opération que vous souhaitez effectuer à chaque fois avant que la vue ne soit visible. Parce que vous faites peut-être des va-et-vient 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 lancer une animation ou charger des données externes à partir d'une API.

  • ViewWillDisappear/DidDisappear - Même idée que ViewWillAppear/ViewDidAppear.

  • ViewDidUnload/ViewDidDispose - En Objective C, vous effectuez le nettoyage et la publication des éléments, mais cette opération est gérée automatiquement.

372
Jacob Knobel

Le cycle de vie d'UIViewController est représenté ici: 

http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/

A view controller's lifecycle, diagrammed

388
Haider

iOS 10,11 _ {(Swift 3.1, Swift 4.0)

Selon UIViewController dans UIKit développeurs,

1. loadView ()

C'est à cet endroit que les sous-classes doivent créer leur hiérarchie de vues personnalisée si elles n'utilisent pas un nib . 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, cela est après -loadView. Pour les contrôleurs de vue non archivés d'un nib, cela se produit une fois la vue définie.

4. viewWillAppear (_ animé: Bool)} _

Appelé lorsque la vue est sur le point de devenir visible. Par défaut ne fait rien

5. viewWillLayoutSubviews ()

Appelée juste avant que la méthode layoutSubviews du contrôleur de vue ne soit appelée. Les sous-classes peuvent être mises en œuvre si nécessaire. Par défaut ne fait rien.

6. viewDidLayoutSubviews ()

Appelée juste après l'appel de la méthode layoutSubviews du contrôleur de la vue. Les sous-classes peuvent être mises en œuvre si nécessaire. Par défaut ne fait rien.

7. viewDidAppear (_ animé: Bool)} _

Appelé lorsque la vue a été entièrement transférée sur l'écran. Par défaut ne fait rien

8. viewWillDisappear (_ animé: Bool)}

Appelé lorsque la vue est rejetée, couverte ou autrement masquée. Par défaut ne fait rien

9. viewDidDisappear (_ animé: Bool)

Appelé après que la vue ait été rejetée, couverte ou cachée d'une autre manière. Par défaut ne fait rien

10. viewWillTransition (à la taille: CGSize, avec le coordinateur: UIViewControllerTransitionCoordinator))}

Appelé lorsque la vue est en transition.

11. willMove (toParentViewController parent: UIViewController?))

12. didMove (toParentViewController parent: UIViewController?))

Ces deux méthodes sont publiques pour les sous-classes de conteneur à appeler lors de la transition entre contrôleurs enfants. S'ils sont remplacés, les remplacements doivent permettre d'appeler le super. 

L'argument parent dans ces deux méthodes est nul lorsqu'un enfant est supprimé 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 concernant la mémoire. Sur iOS 6.0, la vue ne sera plus effacée par défaut.

35
Rajamohan S

À partir de iOS 6 et des versions ultérieures. Le nouveau diagramme est le suivant:

enter image description here

28
Saad

Les méthodes viewWillLayoutSubviews et viewDidLayoutSubviews ne sont pas mentionnées dans les diagrammes, mais sont appelées entre viewWillAppear et viewDidAppear. Ils peuvent être appelés plusieurs fois.

18
gjgjgj

Il y a beaucoup d'informations obsolètes et incomplètes ici. Pour iOS 6 et plus récent uniquement:

  1. loadView[une]
  2. viewDidLoad[une]
  3. viewWillAppear
  4. viewWillLayoutSubviews est la première fois que les limites sont finalisées
  5. viewDidLayoutSubviews
  6. viewDidAppear
  7. *viewWillLayoutSubviews[b]
  8. *viewDidLayoutSubviews[b]

Notes de bas de page:

(a) - Si vous supprimez manuellement votre vue pendant didReceiveMemoryWarning, loadView et viewDidLoad seront rappelés. C'est-à-dire que, par défaut, loadView et viewDidLoad ne sont appelés qu'une seule fois par instance de contrôleur de vue .

(b) Peut être appelé une nouvelle fois 0 ou plusieurs fois .

16
bobics

La réponse de Haider est correcte pour les versions antérieures à iOS 6. Cependant, à partir de iOS 6, viewDidUnload et viewWillUnload ne sont jamais appelés. Etat docs : "Les vues ne sont plus purgées dans des conditions de mémoire insuffisante et cette méthode n'est donc jamais appelée."

16
Matt Becker

Explication des transitions d’état dans la documentation officielle: https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html

Cette image montre les transitions d’états valides entre les différentes méthodes de rappel «will» et «did» de la vue.

Transitions d'état valides:

 
Extrait de: https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Classe de référence_2x.png

9
Luismi

Conformément à le document Apple - Développer des applications iOS (Swift) - Travailler avec les contrôleurs de vue - Comprendre le cycle de vie du contrôleur de vue

viewDidLoad()— Appelé lorsque la vue de contenu du contrôleur de vue (en haut de sa hiérarchie de vues) est créée et chargée à partir d'un storyboard . … Utilisez cette méthode pour effectuer toute configuration supplémentaire requise par votre contrôleur de vue.

viewWillAppear()— Appelé juste avant l'ajout de la vue du contenu du contrôleur de vue à la hiérarchie de vues de l'application. Utilisez cette méthode pour déclencher toute opération devant être effectuée avant que la vue du contenu ne soit présentée à l'écran.

viewDidAppear()— Appelé juste après que la vue de contenu du contrôleur de vue a été ajoutée à la hiérarchie de vues de l'application. Utilisez cette méthode pour déclencher toutes les opérations qui doivent être exécutées dès que la vue est présentée à l'écran, telles que l'extraction de données ou l'affichage d'une animation.

viewWillDisappear()— Appelé juste avant que la vue du contenu du contrôleur de vue ne soit supprimée de la hiérarchie des vues de l'application. Utilisez cette méthode pour effectuer des tâches de nettoyage telles que la validation des modifications ou la renonciation au statut de premier répondant.

viewDidDisappear()— Appelé juste après que la vue de contenu du contrôleur de vue a été supprimée de la hiérarchie de vues de l'application. Utilisez cette méthode pour effectuer des activités de démontage supplémentaires. 

0
freddieoh