web-dev-qa-db-fra.com

Quelle est la différence entre -viewWillAppear: et -viewDidAppear :?

Quelle est la différence entre -[UIViewController viewWillAppear:] et -[UIViewController viewDidAppear:]?

125
PJR

En général, voici ce que je fais:

1) ViewDidLoad - Chaque fois que j'ajoute des contrôles à une vue devant apparaître avec la vue, je le mets immédiatement dans la méthode ViewDidLoad. Fondamentalement, cette méthode est appelée chaque fois que la vue a été chargée en mémoire. Ainsi, par exemple, si mon point de vue est un formulaire avec 3 étiquettes, j'ajouterais les étiquettes ici; la vue n'existera jamais sans ces formes.

2) ViewWillAppear : J'utilise généralement ViewWillAppear simplement pour mettre à jour les données du formulaire. Ainsi, pour l'exemple ci-dessus, j'utiliserais cela pour charger les données de mon domaine dans le formulaire. La création de UIViews est assez chère, et vous devriez éviter autant que possible de le faire avec la méthode ViewWillAppear, car lorsque cela est appelé, cela signifie que l'iPhone est déjà prêt à montrer UIView à l'utilisateur, et tout ce qui est lourd à faire ici. aura un impact très visible sur les performances (animation retardée, etc.).

3) ViewDidAppear : Enfin, j'utilise ViewDidAppear pour démarrer de nouveaux threads sur des tâches qui prendraient beaucoup de temps à s'exécuter, comme par exemple faire un appel de service Web pour obtenir des données supplémentaires pour le formulaire ci-dessus. étant donné que la vue existe déjà et est affichée à l'utilisateur, vous pouvez afficher un joli message "En attente" à l'utilisateur pendant que vous récupérez les données.

284
Chetan Bhalara

viewDidLoad === >>> Placez votre code d'initialisation ici. Ne mettez pas de données dynamiques qui pourraient changer pendant le cycle de vie de la vue. Ainsi, si vous extrayez des données à partir de données de base, vous ne voulez pas le faire ici si cela pouvait changer pendant la vie de la vue. Par exemple: disons que vous avez un contrôleur de tabulation. Vous passez de tab1 à tab2 et modifiez quelque chose sur le modèle dans tab2. Si vous revenez à l'onglet 1 et que votre code de modèle a été effectué dans viewDidLoad, cela ne sera pas mis à jour (en supposant que vous n'utilisez pas KVO ou NSFetchedResultsController, etc.).

viewWillAppear === >>> Ceci est appelé à chaque fois que la vue est sur le point d'apparaître, que la vue soit déjà en mémoire ou non. Placez votre code dynamique ici, tel que la logique de modèle.

viewDidAppear === >>> Mettez ici les opérations coûteuses que vous ne voulez effectuer que si vous êtes certain que la vue est affichée, telles que les appels réseau.

Remarque: si votre application est en arrière-plan et revient au premier plan, vous devez gérer cela à l'aide de NSNotificationCenter. J'ai écrit le code pour cela dans les commentaires ci-dessous. Vous pourriez penser que viewWillAppear/viewDidAppear se déclenchera. Mettez un point de rupture là-bas et testez-le. Ça ne tire pas. Ainsi, si quelque chose a changé pour votre application alors qu'elle était en arrière-plan, vous devez la mettre à jour à l'aide de notifications.

43
smileBot

La méthode viewWillAppear est appelée avant le chargement de la vue réelle.

La méthode viewDidAppear est appelée lorsque la vue est déjà chargée et que vous souhaitez afficher quelque chose.

11
puneet kathuria

viewWillAppear:
■ Appelé avant l’ajout de la vue à la hiérarchie des fenêtres
■ Appelé avant [vc.view layoutSubviews] (si nécessaire)
viewDidAppear :
■ Appelé après l'ajout de la vue à la hiérarchie des vues
■ Appelé après [vc.view layoutSubviews] (si nécessaire)

8
andyqee

Quelques observations:

  • La méthode viewDidLoad est appelée lors de la première instanciation de la vue. Les références IBOutlet sont liées au moment de l'appel, mais pas avant. La frame de la vue peut ne pas être établie au moment de l'appel, cependant. C'est un endroit idéal pour ajouter/configurer des sous-vues et leurs contraintes associées. Toutefois, si vous effectuez une configuration manuelle des valeurs frame sur la base des dimensions de la vue principale, la configuration de ces images doit être différée jusqu'à viewWillAppear ou viewDidLayoutSubviews.

  • La méthode viewWillAppear est appelée lorsque la présentation de la vue dans la hiérarchie des vues est sur le point de commencer. Ceci est appelé notamment au début de l'animation (le cas échéant) de la présentation de la vue. Son compagnon, viewWillDisappear, est évidemment appelé lorsque la transition en dehors de cette vue commence.

  • La méthode viewDidAppear est appelée lorsque la présentation de la vue est effectuée, notamment lorsque toute animation associée est terminée. Son compagnon, viewDidDisappear, est évidemment appelé lorsque la transition en dehors de cette vue est terminée.

Deux mises en garde importantes:

  • viewDidLoad est appelé une et une seule fois lorsque la vue est instanciée pour la première fois. Par contre, viewWillAppear et viewDidAppear seront appelés non seulement lorsque la vue est présentée pour la première fois, mais à chaque fois que la même vue en question est présentée à nouveau. Par exemple, lorsque vous présenterez une vue pour la première fois, ces trois méthodes seront appelées. Si la vue en question présente par la suite une autre vue qui est ensuite rejetée, les variables viewWillAppear et viewDidAppear sont généralement rappelées lorsque la vue en question est ajoutée et animée dans la hiérarchie, mais viewDidLoad ne le sera pas. viewDidLoad n'est appelé que lorsque cette instance particulière est créée pour la première fois.

    Ainsi, si vous voulez faire quelque chose à chaque fois qu'une vue réapparaît (par exemple, vous la rejetez ou y revenez), faites-la dans viewWillAppear ou viewDidAppear. Si vous souhaitez que cela ne se produise que lors de la première instanciation de la vue, faites-le dans viewDidLoad.

  • L'appel de viewWillAppear ne garantit pas que la transition vers cette vue sera un jour terminée. En particulier, si vous utilisez une transition interactive basée sur une saisie utilisateur en temps réel, cette transition interactive peut être annulée. C'est-à-dire que le fait que viewWillAppear soit appelé ne signifie pas que viewDidAppear sera appelé. C'est généralement le cas, mais si le geste interactif est annulé, ce ne sera pas le cas (car la transition n'est jamais terminée).

    Lors de la WWDC 2013, dans le contexte de transitions interactives, un présentateur a plaisanté en disant qu'ils devraient renommer viewWillAppear en "viewMightAppear, ou viewWillProbablyAppear ou iReallyWishThisViewWouldAppear".

    Un exemple de geste interactif intégré consiste à utiliser une variable UINavigationController et à "faire glisser votre doigt depuis le bord gauche" pour créer un aperçu de la vue. La viewWillAppear sera appelée pour la vue sur laquelle vous sautez, mais si vous annulez ce "balayage de bord gauche" pour revenir à la vue à partir de laquelle vous avez commencé ce geste, la pop est annulée et la viewDidAppear pour la vue que vous avez vue. commencé à revenir à ne sera jamais appelé.

    En définitive, vous devez veiller à ne pas écrire de code qui suppose que chaque appel à viewWillAppear sera suivi d'un appel à viewDidAppear. Si la transition est annulée, ce ne sera pas le cas.

5
Rob

viewwillappear appellera avant de charger la vue afin que vous puissiez effectuer certaines tâches avant de charger cette vue et viewdidappear appellera après avoir chargé la vue afin que la tâche de publication soit effectuée avec cette méthode

5
dks1725

Différence entre "will" et "did" ... Comme son nom l'indique, viewWillAppear est appelé avant que la vue ne soit sur le point d'apparaître et que viewDidAppear soit appelé lorsque la vue apparaît.

4
Mahesh

1) ViewWillAppear : La vue chargée en mémoire, appelée une fois dans le contrôleur de vue et ayant son cadre, mais n'apparaissant toujours pas à l'utilisateur

2) ViewDidAppear : Le contrôleur a été ajouté à la hiérarchie des vues afin que vous puissiez le présenter au prochain contrôleur.

4
Abuzeid Ibrahim

Pour résumer:

-viewWillAppear -> mettre à jour les données (recharger les données depuis une vue table)

-viewDidAppear -> opérations coûteuses (appel d'API avec une belle progression!)

3
Nahuel Roldan

Le premier survient avant que la vue apparaisse et le dernier se produit après.

3
Marc Abramowitz

Comme son nom l'indique, viewWillAppear est appelé avant que la vue ne soit sur le point d'apparaître et viewDidAppear est appelée lorsque la vue apparaît.

1
visakh7

Usecase, c'est-à-dire quand devrais-je utiliser lequel?

viewDidLoad - lorsque des étiquettes, des boutons (tous les contrôles/sous-vues) sont connectés au fichier d'interface de la vue et si vous voulez les charger en même temps que la vue du ViewController, et si vous voulez le charger en mémoire une fois en finir avec ça

viewWillAppear - vous voulez changer la couleur d'arrière-plan de la vue chaque fois que viewController apparaît à l'écran. De manière plus réaliste, si vous voulez la couleur d’arrière-plan DarkMode le soir et la couleur de fond de la vue d’arrière-plan le jour, choisissez ce code dans viewWillAppear

Un autre bon casus ici https://stackoverflow.com/a/39395865/5438240

Notez également que, si vous utilisez une pile de navigation (UINavigationController), le viewController sur le point d'être sauté a le viewWillDisappear() appelé, et le ViewController qui sera au-dessus de la pile aura le viewWillAppear() appelé

0
Naishta