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 ...
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
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];
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.
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%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)
istTags und Links iphone uitableview ipad viewdidload awakefromnib