Welchen sollte ich verwenden, -awakeFromNib oder -viewDidLoad?

Ich hatte kürzlich ein Problem in meiner App, bei dem einige der Unteransichten, die ich in einer UAViewController-Unterklasse -awakeFromNib Methode erstellt habe, aus der Ansicht verschwanden. Nach einigem Stöbern stellte ich fest, dass das Verschieben des Codes, den ich in ” -awakeFromNib in ” -awakeFromNib -viewDidLoad das Problem triggerse. Scheint, dass -awakeFromNib nur einmal aufgerufen wird, wenn der UIViewController von der Nib entfernt wird, und -viewDidLoad wird jedes Mal aufgerufen, wenn die Ansicht archiviert wird.

Also, was ist die beste Praxis? Es sieht so aus, als ob UAViewControllers -awakeFromNib der Ansicht keine Ansichten -awakeFromNib sollte, diese Art von -viewDidLoad sollte in -viewDidLoad erledigt -viewDidLoad . Verstehe ich das richtig? Oder bin ich mehr verwirrt als ich dachte?

awakeFromNib wird aufgerufen, wenn der Controller selbst von einer Nib entfernt wird. viewDidLoad wird aufgerufen, wenn die Ansicht erstellt / nicht archiviert wird. Diese Unterscheidung ist besonders wichtig, wenn die Ansicht des Controllers in einer separaten NIB-Datei gespeichert ist.

Wichtig ist auch, dass die function ” awakeFromNib ” nach der Wiederherstellung aus der Speicherwarnung nie aufgerufen wird. Aber die function viewDidLoad wird aufgerufen.

Ja das ist richtig. Sie sollten sich nicht wirklich auf awakeFromNib , um diese Art von Aufgaben zu erledigen.

awakeFromNib ähnelt einem Ereignis, das nach der Deserialisierung in .NET aufgerufen wird. viewDidLoad ähnelt dem Load Ereignis in .NET.

Wenn Sie mit den Konzepten von .NET vertraut sind, sollte das genug sein, denke ich.

Ich versuche zu antworten, indem ich ein Beispiel gebe:

Wenn Sie die customCell class und die customCell.xib Datei definieren, laden Sie die Zelle anschließend mit
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options , wachtFromNib wird aufgerufen, wenn die Objekte in der Xib sind aus dem Archiv entfernt.

Wenn Sie einen customViewController definieren, wird beim customViewController des customViewController mit - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil . viewDidLoad wird aufgerufen, wenn es in die Ansichtshierarchie geladen wird.

Einige verwandte verwirrende Methoden:

  • (void) loadView; Hier sollten Unterklassen ihre benutzerdefinierte Ansichtshierarchie erstellen, wenn sie keine Feder verwenden. Wenn Sie keinen Nib-Namen angeben, versucht loadView, eine Nib zu laden, deren Name mit der class Ihres View-Controllers übereinstimmt. Wenn keine solche Nib vorhanden ist, müssen Sie entweder -setView: aufrufen, bevor -view aufgerufen wird, oder die Methode -loadView überschreiben, um Ihre Sichten programmatisch einzurichten. -loadView sollte niemals direkt aufgerufen werden.

  • (void) viewDidLoad: Wird aufgerufen, nachdem die Ansicht geladen wurde. Für im Code erstellte viewControllers ist dies nach -loadView. Bei Ansichtscontrollern, die von einer Schreibfeder entfernt wurden, ist dies der Fall, nachdem die Ansicht festgelegt wurde.