awakeFromNib, Outlets und Storyboards: Ist die Dokumentation falsch?

LautNSObject UIKit Additions-ReferenzAusgangsvariablen sollten zeitlich festgelegt werdenawakeFromNib heißt (Schwerpunkt alle meine):

Die NIB-Lade-Infrastruktur sendet eine awakeFromNib-Nachricht an jedes Objekt, das aus einem NIB-Archiv neu erstellt wurde, jedoch erst, nachdem alle Objekte im Archiv geladen und initialisiert wurden.Wenn ein Objekt eine awakeFromNib-Nachricht empfängt, ist garantiert, dass alle seine Ausgangs- und Aktionsverbindungen bereits hergestellt sind.

...

Wichtig: Da die Reihenfolge, in der Objekte aus einem Archiv instanziiert werden, nicht garantiert ist, sollten Ihre Initialisierungsmethoden keine Nachrichten an andere Objekte in der Hierarchie senden.Nachrichten an andere Objekte können mit einer awakeFromNib-Methode sicher gesendet werden.

Normalerweise implementieren Sie awakeFromNib für Objekte, für die zusätzliche Einstellungen erforderlich sind, die zur Entwurfszeit nicht möglich sind. Mit dieser Methode können Sie beispielsweise die Standardkonfiguration von Steuerelementen so anpassen, dass sie den Benutzereinstellungen oder den Werten in anderen Steuerelementen entspricht. Sie können es auch verwenden, um einzelne Steuerelemente auf einen früheren Status Ihrer Anwendung zurückzusetzen.

Dies entspricht jedoch nicht meinen Tests, zumindest bei Verwendung von Storyboards. Die Ergebnisse des folgenden Tests scheinen der Dokumentation zu widersprechen:

Erstellen Sie eine neue Einzelansicht-Anwendung in Xcode.Ziehen Sie einen zweiten ViewController auf das Storyboard.Weisen Sie dem ersten ViewController eine Schaltfläche zu und erstellen Sie aus dieser Schaltfläche einen modalen Bereich, in dem der zweite ViewController angezeigt wird.Erstellen Sie eine ViewController-Klassendatei für den zweiten ViewController.Erstellen Sie eine Bezeichnung auf dem zweiten ViewController im Storyboard und erstellen Sie einen Ausgang mit dem NamensomeLabel von dort in die entsprechende ViewController-Klasse.Fügen Sie Folgendes hinzuawakeFromNib Implementierung zum zweiten ViewController:

.

- (void) awakeFromNib {
    [super awakeFromNib];
    if (self.someLabel == nil) {
        NSLog(@"someLabel property is nil");
    }
    else {
        NSLog(@"someLabel property is not nil");
    }

    if (_someLabel == nil) {
        NSLog(@"_someLabel is nil");
    }
    else {
        NSLog(@"_someLabel is not nil");
    }
}
Starten Sie die App im Simulator und klicken Sie auf die Schaltfläche.

Wenn ich das mache, beobachte ich folgendes protokolliert:

2013-07-01 09:24:35.755 test[498:c07] someLabel property is nil
2013-07-01 09:24:35.758 test[498:c07] _someLabel is nil

Infolge dieses Verhaltens muss ich einen Hack wie den in der Antwort vorgeschlagenen verwenden, wenn meine ViewController eine Initialisierungslogik mit ihren Ausgängen benötigenHier um die Steckdosen nutzen zu können. Wenn ich die Dokumentation richtig verstehe, ist die Tatsache, dass ich gezwungen bin, diesen Hack zu verwenden, ein Fehler im Verhalten von UIKit und ichsollen in der Lage sein, diese Initialisierung in zu setzenawakeFromNib und einfach die Steckdosen ohne irgendwelche Hacks benutzen.

Ich kann dieses Problem im Internet jedoch nicht anders erwähnen, was seltsam erscheint, wenn man bedenkt, wie wichtig diese Funktionalität für mich ist. Ich habe auch nie aktuelle NIB-Dateien verwendet, sondern nur Storyboards. Daher fehlt mir eine gewisse Perspektive. Die Dokumentation zu diesem Thema ist ausführlich und schwierig genug, sodass ich als Anfänger von iOS nicht sicher bin, ob ich es verstanden habe korrekt. Handelt es sich um einen echten UIKit-Fehler, oder habe ich die Dokumentation auf irgendeine Weise missverstanden? Vielleicht ist diese Methode nicht einmal für die Verwendung in Verbindung mit Storyboards gedacht?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage