webentwicklung-frage-antwort-db.com.de

UIViewController viewDidLoad vs. viewWillAppear: Was ist die richtige Arbeitsteilung?

Ich war mir immer ein bisschen unklar über die Art der Aufgaben, die viewDidLoad gegenüber viewWillAppear zugewiesen werden sollten: in einer UIViewController Unterklasse.

z.B. Ich mache eine App, in der eine Unterklasse von UIViewController auf einen Server trifft, Daten abruft, einer Ansicht zuführt und diese Ansicht dann anzeigt. Welche Vor- und Nachteile hat dies in viewDidLoad vs. viewWillAppear?

158
dugla

viewDidLoad ist Dinge, die Sie einmal tun müssen. viewWillAppear wird jedes Mal aufgerufen, wenn die Ansicht angezeigt wird. Sie sollten Dinge tun, die Sie in viewDidLoad nur einmal tun müssen - wie das Festlegen Ihrer UILabel-Texte. Möglicherweise möchten Sie jedoch einen bestimmten Teil der Ansicht jedes Mal ändern, wenn der Benutzer sie anzeigt, z. Die iPod-Anwendung scrollt die Texte jedes Mal nach oben, wenn Sie zur Ansicht "Aktuelle Wiedergabe" wechseln.

Wenn Sie jedoch Dinge von einem Server laden, müssen Sie auch über die Latenz nachdenken. Wenn Sie Ihre gesamte Netzwerkkommunikation in viewDidLoad oder viewWillAppear packen, werden diese ausgeführt, bevor der Benutzer die Ansicht sieht. Dies kann zu einem kurzen Einfrieren Ihrer App führen. Es kann eine gute Idee sein, dem Benutzer zunächst eine nicht ausgefüllte Ansicht mit einer Art Aktivitätsanzeige anzuzeigen. Wenn Sie mit Ihrem Netzwerk fertig sind, was eine oder zwei Sekunden dauern kann (oder sogar scheitern kann - wer weiß?), Können Sie die Ansicht mit Ihren Daten füllen. Gute Beispiele dafür finden Sie in verschiedenen Twitter-Clients. Wenn Sie beispielsweise die Autorendetailseite in Twitterrific anzeigen, wird in der Ansicht nur "Loading ..." angezeigt, bis die Netzwerkabfragen abgeschlossen sind.

248
LeonBrussels

Anfangs nur ViewDidLoad mit tableView verwendet. Beim Testen mit WLAN-Verlust wurde durch Aktivieren des Flugzeugmodus festgestellt, dass die Tabelle bei der Rückkehr von WLAN nicht aktualisiert wurde. Tatsächlich scheint es keine Möglichkeit zu geben, tableView auf dem Gerät zu aktualisieren, selbst wenn Sie in -Info.plist auf die Home-Schaltfläche klicken und der Hintergrundmodus auf YES gesetzt ist.

Meine Lösung:

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

Es ist wichtig zu beachten, dass die Verwendung von viewDidLoad für die Positionierung etwas riskant ist und vermieden werden sollte, da die Grenzen nicht festgelegt sind. Dies kann zu unerwarteten Ergebnissen führen (ich hatte verschiedene Probleme ...)

Dieser Beitrag beschreibt ziemlich gut die verschiedenen Methoden und was in jeder von ihnen passiert.

derzeit für einmalige Init und Positionierung Ich denke darüber nach, viewDidAppear mit einem Flag zu verwenden. Wenn jemand eine andere Empfehlung hat, lass es mich bitte wissen.

10
keisar

Kommt darauf an, müssen die Daten geladen werden jedes Mal, wenn Sie die Ansicht öffnen? oder nur einmal?

enter image description here

  • Red: Sie müssen sich nicht jedes Mal ändern. Sobald sie geladen sind, bleiben sie so, wie sie waren.
  • Purple: Sie müssen sich im Laufe der Zeit oder nach jedem Laden ändern. Sie möchten nicht die 3 vorgeschlagenen Benutzer sehen, denen Sie folgen möchten. Sie müssen sie jedes Mal neu laden, wenn Sie zum Bildschirm zurückkehren. Ihre Fotos werden möglicherweise aktualisiert ... Sie möchten kein Foto von vor 5 Jahren sehen ...

viewDidLoad: Welche Verarbeitung Sie auch immer haben, sie muss einmal ausgeführt werden.
viewWilLAppear: Welche Verarbeitung sich bei jedem Laden der Seite ändern muss.

Beschriftungen, Symbole, Schaltflächentitel oder die meisten dataInputedByDeveloper normalerweise ändern sich nicht. Namen, Fotos, Links, Schaltflächenstatus, Listen (Eingabe-Arrays für Ihre tableViews oder collectionView) oder die meisten dataInputedByUser normalerweise ändern sich.

4
Honey