awakeFromNib, outlety i storyboardy: czy dokumentacja jest błędna?

WedługNSObject UIKit Additions Reference, zmienne wyjściowe powinny być ustawione do czasuawakeFromNib nazywa się (podkreśl wszystkie moje):

Infrastruktura ładowania końcówek wysyła komunikat awakeFromNib do każdego obiektu odtworzonego z archiwum końcówek, ale dopiero po załadowaniu i zainicjowaniu wszystkich obiektów w archiwum.Gdy obiekt otrzyma komunikat awakeFromNib, ma pewność, że wszystkie jego gniazda i połączenia są już ustanowione.

...

Ważne: Ponieważ kolejność tworzenia obiektów z archiwum nie jest gwarantowana, metody inicjowania nie powinny wysyłać wiadomości do innych obiektów w hierarchii.Wiadomości do innych obiektów można bezpiecznie wysyłać z metody awakeFromNib.

Zazwyczaj awakeFromNib jest implementowany dla obiektów, które wymagają dodatkowej konfiguracji, której nie można wykonać w czasie projektowania. Na przykład możesz użyć tej metody, aby dostosować domyślną konfigurację dowolnych formantów do preferencji użytkownika lub wartości w innych formantach. Możesz również użyć go, aby przywrócić poszczególne elementy sterowania do poprzedniego stanu aplikacji.

Nie pasuje to jednak do moich testów, przynajmniej przy użyciu serii ujęć. Wyniki poniższego testu wydają się przeczyć dokumentacji:

Utwórz nową aplikację Single View w Xcode.Przeciągnij drugi ViewController na scenorys.Daj pierwszemu ViewControllerowi przycisk i utwórz modalne segue z tego przycisku, który wyświetla drugi ViewController.Utwórz plik klasy ViewController dla drugiego kontrolera ViewController.Utwórz etykietę na drugim ViewControllerze w serii ujęć i utwórz gniazdko o nazwiesomeLabel z niego do odpowiedniej klasy ViewController.Dodaj następująceawakeFromNib implementacja do drugiego kontrolera 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");
    }
}
Uruchom aplikację w symulatorze i kliknij przycisk.

Kiedy to robię, obserwuję następujące informacje:

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

W konsekwencji tego zachowania, gdy potrzebuję moich ViewControllerów, aby posiadali jakąś logikę inicjalizacji, która obejmuje ich gniazda, muszę użyć hacku takiego jak ten zaproponowany w odpowiedzitutaj aby móc korzystać z punktów sprzedaży. Jeśli dobrze rozumiem dokumentację, fakt, że jestem zmuszony użyć tego hacka, jest błędem w zachowaniu UIKit, a japowinien aby móc wprowadzić tę inicjalizacjęawakeFromNib i po prostu korzystaj z gniazd bez żadnych hacków.

Nie mogę jednak znaleźć żadnej innej wzmianki o tym problemie w Internecie, co wydaje się dziwne, biorąc pod uwagę, jak istotną część funkcjonalności wydaje mi się. Nigdy też nie korzystałem z rzeczywistych plików nib, tylko storyboardów, więc brakuje mi jakiejś perspektywy na ten temat, a dokumentacja na ten temat jest wystarczająco szczegółowa i trudna, że ​​jako nowicjusz w iOS nie jestem pewien, czy zrozumiałem poprawnie. Czy jest to prawdziwy błąd UIKit, czy też w jakiś sposób źle zrozumiałem dokumentację - być może ta metoda nie ma być nawet używana w połączeniu z storyboardami?

questionAnswers(2)

yourAnswerToTheQuestion