2012-06-11 77 views
18

我知道有很多類似的問題,但我找不到具體解決這個問題的問題。爲什麼viewDidLoad中的self.navigationController爲null?

爲什麼self.navigationControllerviewDidLoad中被調用時爲空,但從外部調用時是否正確viewDidLoad

這是我的輸出NSLog(@"%@",self.navigationController);首先是所謂的viewDidLoad,第二我加入一個按鈕的界面與調用NSLog(@"%@",self.navigationController);的方法:

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

我知道必須有這一些簡單的解釋行爲,我只是好奇它是什麼。謝謝!

+0

您是先打電話給[super viewDidLoad]嗎? – jrturton

+0

這裏有一個類似的問題:http://stackoverflow.com/questions/7497183/problem-with-navigationcontroller。被接受的答案與Mike的下文相同,但稍微深入一點。 – gtmtg

回答

58

當您首次訪問該控制器上的-view方法/屬性時,會加載視圖控制器的視圖。視圖加載完成後,調用viewDidLoad方法。這非常簡單。您還必須記住,如果在視圖不在屏幕上時接收到內存警告,則可以多次加載/卸載視圖。

因此viewDidLoad並不意味着您的視圖控制器已被插入導航控制器。在將視圖控制器推到導航控制器上的過程中,它的view將被訪問並加載,但在整個推送完成之前將發生。所以viewDidLoad顯然是在navigationController屬性更新之前調用的。

在將視圖控制器推到導航控制器上之前,您還必須考慮代碼的其他部分可能正在訪問視圖控制器的視圖。因此viewDidLoad是做錯事情的錯誤地方。您可能想要使用像viewDidAppear:這樣的方法,以便您知道視圖控制器的視圖在調用時是視圖層次結構的一部分。

+3

是的,我把我的代碼移到'viewWillAppear:',它工作正常。我只是對推理感到好奇。你的文章清除了它。謝謝。 –

相關問題