Question

J'ai toujours été un peu clair sur le type de tâches qui doivent être affectés à viewDidLoad par rapport viewWillAppear: dans une sous-classe de UIViewController.

par exemple. Je fais une application où j'ai une sous-classe de UIViewController frapper un serveur, d'obtenir des données, l'alimentation à une vue et afficher ce point de vue. Quels sont les avantages et les inconvénients de le faire dans viewDidLoad vs viewWillAppear?

Était-ce utile?

La solution

viewDidLoad est des choses que vous devez faire une fois. viewWillAppear est appelé à chaque fois que la vue apparaît. Vous devriez faire des choses que vous avez seulement à faire une fois dans viewDidLoad - cadre comme vos textes UILabel. Cependant, vous pouvez modifier une partie spécifique de la vue à chaque fois que l'utilisateur obtient pour le voir, par exemple les rouleaux d'application iPod les paroles des chansons de retour au sommet chaque fois que vous allez à la vue « Lecture en cours ».

Toutefois, lorsque vous chargez des choses à partir d'un serveur, vous devez également penser à la latence. Si vous emballez toutes vos communications réseau dans viewDidLoad ou viewWillAppear, ils seront exécutés avant que l'utilisateur obtient de voir la vue - qui peut entraîner un court gel de votre application. Il peut être une bonne idée d'abord montrer à l'utilisateur une vue dépeuplé avec un indicateur d'activité de quelque sorte. Lorsque vous avez terminé votre réseau, ce qui peut prendre une seconde ou deux (ou peut 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 peut être vu dans divers clients twitter. Par exemple, lorsque vous affichez la page de détail auteur Twitterrific, la vue dit que « Loading ... » jusqu'à ce que les requêtes du réseau ont terminé.

Autres conseils

Dans un premier temps utilisé uniquement avec viewDidLoad tableView. Le test avec perte de Wifi, par dispositif de réglage en mode avion, rendu compte que la table n'a pas rafraichir avec retour de Wifi. En fait, il semble y avoir aucun moyen de rafraîchir tableView sur l'appareil même en appuyant sur le bouton d'accueil avec en arrière-plan activée dans le -Info.plist.

Ma solution:

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

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

Ce message décrit assez bien les différentes méthodes et ce qui se passe dans chacun d'eux.

actuellement un temps d'initialisation et de positionnement Je pense à l'aide viewDidAppear avec un drapeau, si quelqu'un a une autre recommandation s'il vous plaît laissez-moi savoir.

depends, avez-vous besoin de données à charger chaque vous ouvrez la vue? ou seulement une fois ?

  • Rouge: Ils ne nécessitent pas de changer à chaque fois. Une fois qu'ils sont chargés ils restent la façon dont ils étaient.
  • Purple: Ils doivent changer au fil du temps ou après le chargement à chaque fois. Vous ne voulez pas voir les mêmes 3 suggéré aux utilisateurs de suivre, il doit être rechargé chaque fois que vous revenez à l'écran. Leurs photos peuvent se mis à jour ... vous ne voulez pas voir une photo de 5 ans ...

viewDidLoad: Quel que soit le traitement que vous avez qui doit être fait une fois.
viewWilLAppear: Quel que soit le traitement qui doit changer chaque fois que la page est chargée.

Les étiquettes, les icônes, les titres de bouton ou plus dataInputedByDeveloper habituellement ne changent pas. Noms, photos, liens, l'état des boutons, listes (tableaux d'entrée pour vos tableViews ou CollectionView) ou plus dataInputedByUser habituellement changent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top