web-dev-qa-db-fra.com

UIViewController viewDidLoad vs. viewWillAppear: Quelle est la division appropriée du travail?

J'ai toujours été un peu incertain sur le type de tâches à attribuer à viewDidLoad et à viewWillAppear: dans une sous-classe UIViewController.

par exemple. Je fais une application où j'ai une sous-classe UIViewController frappant un serveur, obtenant des données, l'envoyant dans une vue, puis affichant cette vue. Quels sont les avantages et les inconvénients de le faire dans viewDidLoad vs viewWillAppear?

158
dugla

viewDidLoad est une chose que vous devez faire une fois. viewWillAppear est appelé à chaque fois que la vue apparaît. Vous devriez faire des choses que vous n'avez qu'à faire une fois dans viewDidLoad - comme définir vos textes UILabel. Cependant, vous souhaiterez peut-être modifier une partie spécifique de la vue à chaque fois que l'utilisateur pourra la visualiser, par exemple. L'application iPod fait défiler les paroles vers le haut chaque fois que vous passez à la vue "Lecture en cours".

Toutefois, lorsque vous chargez des éléments à partir d'un serveur, vous devez également tenir compte de la latence. Si vous intégrez toutes vos communications réseau dans viewDidLoad ou viewWillAppear, elles seront exécutées avant que l'utilisateur ne puisse voir la vue, ce qui peut entraîner un gel bref de votre application. Il peut être judicieux de montrer d'abord à l'utilisateur une vue non peuplée avec un indicateur d'activité. Lorsque vous avez terminé votre mise en réseau, ce qui peut prendre une seconde ou deux (ou même échouer - qui sait?), Vous pouvez remplir la vue avec vos données. De bons exemples sur la façon dont cela pourrait être fait peuvent être vus dans divers clients Twitter. Par exemple, lorsque vous affichez la page de détail de l'auteur dans Twitterrific, la vue indique uniquement "Chargement en cours ..." jusqu'à ce que les requêtes réseau soient terminées.

248
LeonBrussels

Initialement utilisé uniquement ViewDidLoad avec tableView. Après des tests avec perte de connexion Wi-Fi, en configurant l'appareil en mode avion, on s'est rendu compte que la table ne se réactualisait pas avec le retour de la connexion Wifi. En fait, il semble n'y avoir aucun moyen d'actualiser tableView sur le périphérique, même en appuyant sur le bouton d'accueil lorsque le mode d'arrière-plan est défini sur OUI dans -Info.plist.

Ma solution:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}
12
Jaminyah

Il est important de noter que l'utilisation de viewDidLoad pour le positionnement est un peu risqué et doit être évité car les limites ne sont pas définies. cela peut provoquer des résultats inattendus (j'ai eu une variété de problèmes ...)

Ce post décrit assez bien les différentes méthodes et ce qui se passe dans chacune d’elles.

je pense utiliser actuellement viewDidAppear avec un drapeau. Si quelqu'un a une autre recommandation, veuillez me le faire savoir.

10
keisar

Dépend, avez-vous besoin que les données soient chargées chaque fois que vous ouvrez la vue ? ou seulement une fois ?

enter image description here

  • Rouge: Ils n'ont pas besoin de changer à chaque fois. Une fois qu'ils sont chargés, ils restent comme ils étaient.
  • Violet: Ils doivent changer dans le temps ou après le chargement à chaque fois. Vous ne voulez pas voir les 3 mêmes utilisateurs suggérés à suivre, il doit être rechargé à chaque fois que vous revenez à l'écran. Leurs photos peuvent être mises à jour ... vous ne voulez pas voir une photo d'il y a 5 ans ...

viewDidLoad: Quel que soit le traitement que vous avez à faire une fois.
viewWilLAppear: Quel que soit le traitement à modifier à chaque chargement de la page.

Les étiquettes, les icônes, les titres de bouton ou la plupart des données dataInputedByDeveloper généralement ne changent pas. Les noms, photos, liens, statut des boutons, listes (tableaux d'entrée pour votre tableViews ou collectionView) ou la plupart des dataInputedByUser généralement changent.

4
Honey