viewDidLoad und watchFromNib Timing

8

Ich nehme an, dass wakeFromNib immer vor viewDidLoad aufgerufen wird.

Ich habe also eine Unterklasse eines UITableViewControllers, der aus einer XIB-Datei entpackt wird.

Ich habe diese zwei Methoden innerhalb definiert:

%Vor%

Was passiert, ist, dass "view did load" vor "wake from nib" in der Konsole erscheint. Ich habe versucht, einen Breakpoint bei [super watchFromNib] zu verwenden, und wiederholt F7 (Step Into), und zu meiner Überraschung ging es in - (void) viewDidLoad, BEVOR man in watchFromNib in die zweite Zeile ging.

Hat jemand eine Ahnung, was hier vor sich geht? Ich habe genau dasselbe in einer Unterklasse eines regulären UIViewControllers gemacht, und die Protokollanweisungen sind umgekehrt, wie ich ursprünglich erwartet hatte ...

    
bogardon 10.06.2011, 06:14
quelle

4 Antworten

11

Um diese Tatsache zu verstehen, empfehle ich Ihnen, loadNibNamed:owner:options: Methode von NSBundle .

Wenn Sie einen View-Controller aus der nib initialisieren, lädt er zuerst Ansichten, die darin enthalten sind, und dann legt er Dateieigner -Eigenschaften entsprechend der nib fest. Die Methode viewDidLoad wird aufgerufen, wenn die Eigenschaft view des Dateieigners auf eine der geladenen Sichten gesetzt wird. Und awakeFromNib wird aufgerufen, wenn alle Filialbesitzer Outlets und Properties festgelegt sind (einschließlich view property). Daher ist es sinnvoll, dass viewDidLoad früher aufgerufen wird als awakeFromNib .

Hoffe, das wird helfen

    
Zapko 10.06.2011, 07:56
quelle
5

Ich glaube nicht, dass du wakefromNib in deiner Superklasse anrufen musst.

Überprüfen Sie dies .

Bearbeiten

Ich habe gerade einen Schnelltest gemacht, hier sind die Ergebnisse:

Szenario 1 : MainWindow.Xib hat eine UIViewController-Unterklasse TestingAwakeFromNibViewController , die eine eigene Nib-Datei TestingAwakeFromNibViewController.xib hat.

TestingAwakeFromNibViewController hat ein UIButton Outlet namens btn3. Testen Sie den folgenden Code:

%Vor%

Würde drucken:

%Vor%

Szenario 2: Entfernen der XIB-Datei, Hinzufügen einer UIView als Sohn zum TestingAwakeFromNibViewController in MainWindow.Xib und Hinzufügen von UIButton als Unteransicht zum UIView (und Verbinden des UIbutton-Ausgangs mit dem entsprechenden Ausgang von TestingAwakeFromNibViewController).

Jetzt würde der obige Code ausgeben:

%Vor%

Bedeutung ViewDidLoad vor AwakeFromNib.

Drittes Szenario : Gleich wie die zweite, ohne [super awakeFromNib];

aufzurufen %Vor%

Jetzt wird ViewDidLoad nicht einmal aufgerufen.

Es sieht also so aus, als würden verschiedene Szenarien unterschiedliche Aktionen erfordern, und wir müssen uns auf das vorbereiten, nach dem wir handeln.

    
Idan 10.06.2011 07:54
quelle
4

Ich erstelle ein Testprojekt mit der Option Navigation-based Application und füge folgende Codes zu rootViewController.m hinzu.

%Vor%

Dann habe ich die Ergebnisse von der Konsole erhalten:

%Vor%

Der -(void)viewDidLoad wird aufgerufen, wenn die Ansicht des Controllers geladen wird. Wenn Sie also self.view = ... zum ersten Mal verwenden, wird -(void)viewDidLoad aufgerufen.

Wenn Sie etwas wie folgt geschrieben haben, wird - (void) viewDidLoad zuerst aufgerufen.

%Vor%     
AechoLiu 10.06.2011 10:54
quelle
0

Ohne ein Experte zu sein und diesen Posts zu folgen, erkenne ich als in einem Tab Controller-Szenario, in der "Kind" Ansicht Controller wird die wakeFromNib Methode ausgeführt, wenn Tab-Controller (Eltern) geladen ist, aber ViewDidLoad nur wenn " Tab "wird angeklickt.

Und deshalb verstehe ich, dass dies verwendet werden kann, um Daten nur zu laden, wenn eine bestimmte Registerkarte ausgewählt (angeklickt)

ist     
Albert Català 03.04.2013 11:48
quelle