Kann jemand beim Arbeiten mit Ansichten und Ansichtscontrollern in einer iPhone-App den Unterschied zwischen loadView und viewDidLoad erklären?
Mein persönlicher Kontext ist, dass ich alle meine Ansichten aus Code erstelle. Ich verwende und werde Interface Builder nicht verwenden, sollte dies einen Unterschied machen.
Ich habe festgestellt, dass ich beim Hinzufügen von Init-Code zu loadView häufig eine unendliche Stapelverfolgung erhalte, sodass ich normalerweise alle meine untergeordneten Ansichten in viewDidLoad erstelle ... aber es ist mir wirklich unklar, wann jeder ausgeführt wird, und Was ist der geeignetere Ort, um Init-Code zu setzen. Was perfekt wäre, ist ein einfaches Diagramm der Initialisierungsaufrufe.
Vielen Dank!
quelle
-(void) loadView { // Frame for Hypnosis view CGRect frame = [[UIScreen mainScreen] bounds]; // Create a Hipnosis view v = [[HypnosisView alloc] initWithFrame:frame]; self.view = v;
loadView
ist die MethodeUIViewController
, mit der die Ansicht tatsächlich geladen und derview
Eigenschaft zugewiesen wird . Dies ist auch der Speicherort, den eine UnterklasseUIViewController
überschreiben würde, wenn Sie dieview
Eigenschaft programmgesteuert einrichten möchten .viewDidLoad
ist die Methode, die aufgerufen wird, sobald die Ansicht geladen wurde. Dies wird aufgerufen, nachdem loadView aufgerufen wurde. Hier können Sie Code überschreiben und einfügen, der die Ansicht nach dem Laden weiter initialisiert.quelle
wird verwendet, wenn Sie Ihre Ansicht von einer NIB laden und nach dem Start Anpassungen vornehmen möchten
wird verwendet, wenn Sie Ihre Ansicht programmgesteuert erstellen möchten (ohne die Verwendung von Interface Builder).
quelle
Fügen Sie einfach einige Codebeispiele hinzu, um zu demonstrieren, was NilObject gesagt hat:
quelle
Um zu verhindern, dass beim Lesen von self.view eine Endlosschleife auftritt, rufen Sie beim Laden einer Ansicht die Super-Implementierung der Klasse auf. Die Super-Implementierung weist Ihnen eine neue UIView zu.
quelle
[super loadView];
. Dies wurde in den Beispielen widersprochen, aber ich denke, die Dokumente haben es richtig gesagt (ich habe im Laufe der Zeit zahlreiche Fehler in Beispielen gefunden).[super loadView]
wird jedoch für UITableViewController usw. benötigt. Jedoch! Alle Einstellungen nach dem Laden (z. B. Hinzufügen zusätzlicher Unteransichten) sollten in viewDidLoad erfolgen.Die einfachste Möglichkeit, loadView zu verwenden, besteht darin, eine Art Basisansichts-Controller wie MyBaseViewController zu erstellen, der eine Unterklasse von UIViewController ist. Erstellen Sie in der loadView-Methode die Ansicht folgendermaßen:
Und wenn Sie einen View-Controller erstellen müssen, verwenden Sie einfach die Unterklasse von MyBaseViewController und rufen in seinem loadView-Controller einfach [super loadView] so auf
quelle
loadView()
wird aufgerufen, wenn Ihr Controller aufgefordert wird, seine zu erstellenself.view
. Sie können es gerne selbst machenOder die übergeordnete UIController-Klasse Ihres Controllers hat bereits einen Methodennamen,
-loadView()
der Ihre self.view in eine leere Ansicht initialisiert. Dann können Sie anrufenIch empfehle den zweiten Ansatz wirklich, da er die Vererbung fördert. Nur wenn Ihr View Controller nicht direkt von UIViewController geerbt wird.
quelle
In der von Apple in viewDidLoad angegebenen Definition wurde erwähnt, dass sie aufgerufen wird, nachdem die Ansicht des Controllers in den Speicher geladen wurde. Einfach ausgedrückt ist es die erste Methode, die geladen wird.
Sie denken vielleicht, unter welchen Bedingungen diese Methode vollständig genutzt wird? Die Antwort lautet: Was auch immer die App zuerst laden soll. Zum Beispiel möchten Sie vielleicht eine andere Hintergrundfarbe anstelle von Weiß, Sie könnten vielleicht Blau wählen.
quelle