2012-06-11 12 views
18

Wiem, że jest wiele podobnych pytań, ale nie mogę znaleźć takiego, który by to specjalnie rozwiązał.Dlaczego self.navigationController null w viewDidLoad?

Dlaczego self.navigationController jest pusta po wywołaniu w viewDidLoad, ale czy jest poprawna, gdy zostanie wywołana z zewnątrz: viewDidLoad?

To moje wyjście z NSLog(@"%@",self.navigationController); Pierwszy nazywa się viewDidLoad, drugi I dodać przycisk do interfejsu z metody, która wywołuje NSLog(@"%@",self.navigationController);:

NavApp[31524:11003] (null) 
NavApp[31524:11003] <UINavigationController: 0x6e21190> 

Wiem, że musi być jakieś proste wyjaśnienie tego zachowanie, po prostu ciekawi mnie, co to jest. Dzięki!

+0

Najpierw dzwonisz [super viewDidLoad]? – jrturton

+0

Istnieje podobne pytanie: http://stackoverflow.com/questions/7497183/problem-with-navigationcontroller. Przyjęta odpowiedź jest taka sama jak w przypadku Mike'a poniżej, ale nieco mniej dogłębna. – gtmtg

Odpowiedz

58

Widok kontrolera widoków jest ładowany po pierwszym dostępie do metody/właściwości tego kontrolera -view. Po wczytaniu widoku wywoływana jest metoda viewDidLoad. Jest to całkiem proste. Należy również pamiętać, że widok może być załadowany/rozładowany wiele razy, jeśli ostrzeżenia o pamięci zostaną odebrane, gdy widok jest poza ekranem.

Tak więc viewDidLoad nie oznacza, że ​​kontroler podglądu został włożony do kontrolera nawigacyjnego. Podczas przesyłania kontrolera podglądu na kontroler nawigacyjny dostęp do jego view będzie możliwy i załadowany, ale stanie się to przed przed zakończeniem całego procesu. Tak więc viewDidLoad jest wyraźnie wywoływane przed zaktualizowaniem właściwości navigationController.

Należy również wziąć pod uwagę, że inna część kodu może mieć dostęp do widoku kontrolera widoku, zanim jeszcze zostanie naciśnięty kontroler widoku na kontroler nawigacyjny.

Tak więc viewDidLoad jest niewłaściwym miejscem do robienia tego, co robisz. Prawdopodobnie chcesz użyć metody, takiej jak viewDidAppear:, aby wiedzieć, że widok kontrolera widoku jest częścią hierarchii widoków, gdy jest wywoływana.

+3

Tak, przeniosłem swój kod do 'viewWillAppear:' i działa dobrze. Byłem po prostu ciekawy co do rozumowania. Twój post wyczyścił to. Dzięki. –

Powiązane problemy