Unterschied zwischen viewDidLoad und viewDidAppear

Antworten:

147

viewDidLoadwird genau einmal aufgerufen, wenn der View Controller zum ersten Mal in den Speicher geladen wird. Hier möchten Sie Instanzvariablen instanziieren und Ansichten erstellen, die für den gesamten Lebenszyklus dieses Ansichtscontrollers gültig sind. Die Ansicht ist jedoch zu diesem Zeitpunkt normalerweise noch nicht sichtbar.

viewDidAppearwird aufgerufen, wenn die Ansicht tatsächlich sichtbar ist, und kann während des Lebenszyklus eines View Controllers mehrmals aufgerufen werden (z. B. wenn ein Modal View Controller geschlossen wird und die Ansicht wieder sichtbar wird). Hier möchten Sie Layoutaktionen ausführen oder Zeichnungen in der Benutzeroberfläche ausführen, z. B. einen modalen Ansichtscontroller. Alles, was Sie hier tun, sollte jedoch wiederholbar sein. Es ist am besten, Dinge hier nicht beizubehalten, da sonst Speicherlecks auftreten, wenn Sie sie nicht freigeben, wenn die Ansicht verschwindet.

Siehe: https://developer.apple.com/documentation/uikit/uiviewcontroller

Davidgoli
quelle
15
Sie und WrightsCS haben absolut Recht. Aber nicht um Haare zu spalten, sondern während viewDidLoades im Allgemeinen nur einmal und nur einmal aufgerufen wird, gibt es eine Situation, in der es erneut aufgerufen werden kann. Insbesondere wenn Sie jemals eine erhalten didReceiveMemoryWarning, werden Ihre nicht sichtbaren Ansichten möglicherweise freigegeben (obwohl die Ansichtssteuerungen unberührt bleiben) und bei Ihrer Rückkehr viewDidLoadmöglicherweise erneut aufgerufen.
Rob
1
Ich bin mir nicht sicher, ob ich dem Kommentar zu View Controller Ivars immer und automatisch für Sie zustimme (der Controller selbst wird nicht freigegeben). Ich vermute, wir könnten beide leicht ein viewDidLoad erstellen, das auslaufen würde, wenn es nach a erneut aufgerufen würde didReceiveMemoryWarning. Aber ich bin damit einverstanden, dass es Ihnen gut gehen viewDidLoadsollte , wenn Sie beim Schreiben bewährte Verfahren anwenden . Mein einziger Punkt ist, dass die schlampige Verwendung von Ivars und die manuelle Speicherverwaltung definitiv zu Undichtigkeiten führen können viewDidLoad. Die Menschen sollten für das didReceiveMemoryWarningSzenario sensibel sein und entsprechend programmieren.
Rob
2
Um den Punkt nicht näher zu erläutern, aber weniger als 24 Stunden nach diesem Austausch, als ich eine andere Frage beantwortete , fand ich ein Beispiel für genau die Art von viewDidLoadCode, auf die durchgesickert sein wird didReceiveMemoryWarning. Seufzer.
Rob
1
Diese Antwort steht in direktem Widerspruch zu dieser anderen: stackoverflow.com/a/3411636/269753 Ich habe beobachtet, dass meine viewDidLoad-Methode mehr als nur einmal aufgerufen wurde, auch wenn überhaupt keine Speicherwarnungen empfangen wurden. Möchte jemand klarstellen?
Ricardo Sanchez-Saez
2
Ich sehe keinen Widerspruch. Diese Frage bezieht sich auf die Beziehung zwischen viewDidLoad und viewDidUnload, nicht auf viewDidAppear.
Davidgoli
21

Einfach ausgedrückt, möchten Sie alle Steuerelemente oder Arrays erstellen viewDidLoad, in viewDidAppeardenen Sie diese Steuerelemente oder Arrays wie in aktualisieren möchten.

viewDidLoadwird einmal aufgerufen, wenn der Controller erstellt wird, und viewDidAppearwird jedes Mal aufgerufen, wenn die Ansicht angezeigt wird. Angenommen, Sie haben eine modale Ansicht, die Sie präsentieren, wenn diese Ansicht verworfen wird, viewDidAppearwird aufgerufen und viewDidLoadnicht aufgerufen.

WrightsCS
quelle
3
Der erste Absatz ist ein gut formulierter Tipp. Aber der zweite Absatz ist falsch. viewDidLoadkann mehrmals aufgerufen werden . Wenn Ihre Ansicht, während sie nicht angezeigt wird (unter einem Stapel anderer Ansichten), von älteren Versionen von iOS in einer Situation mit wenig Arbeitsspeicher entladen wird, lädt der Ansichts-Controller die Ansicht automatisch neu, wenn sie erneut auf dem Bildschirm angezeigt werden muss. In späteren Versionen von iOS können Sie die Speicherauslastung reduzieren, indem Sie das tun, was früher iOS für Sie getan hat: Entladen Sie Offscreen-Ansichten, wenn eine didReceiveMemoryWarningNachricht eingeht. In diesem Fall viewDidLoadwird die erneut aufgerufen.
Basil Bourque
@WrightsCS Haben Sie ein offizielles Apple-Dokument, das das sagt? "viewDidLoad wird beim Erstellen des Controllers einmal aufgerufen" Weil ich mich erinnere, dass viewDidLoad in der Vergangenheit unter Szenarien mit wenig Arbeitsspeicher mehrmals aufgerufen werden konnte. Vielen Dank.
Ricardo