2011-08-16 90 views
2

我的viewDidLoad在視圖控制器中被調用兩次。一次通過[UIViewController View],第二次通過[UINib instanciateWithOwner:Options]。這是爲什麼發生?可以預防嗎?viewDidLoad被調用兩次

感謝

回答

6

你把viewDidLoad內部的任何代碼應能與任何問題,運行多次。如果您的代碼只需要爲您的控制器運行一次,請使用-awakeFromNib。原因是因爲視圖控制器的視圖可以卸載並加載多次。 viewDidLoad中的代碼應該只修改UI以反映當前狀態。

現在我明白了,你的特定問題看起來是一個錯誤。請參閱Ned's answer

+0

好答案。但我不確定有關ViewDidLoad會被多次調用,除非有一些隱藏的引用。但我可能是錯的。 –

+0

viewDidLoad將在需要視圖時自動調用,但不在那裏。如果視圖最初爲零,則使用'controller.view'或'[controller view]'會導致viewDidLoad被調用。如果未在instanciateWithOwner中設置視圖,或者之後卸載視圖,則可能是它再次被調用的原因。 – Joe

1

您可能需要檢查對象構建機制。如果只有一個參考控制器的nib文件,則不應該多次調用此方法。 (除非對象正在重建)。

我想你可能必須在ViewDidLoad idemPotent中創建你的代碼。確保框架回調方法做出這個假設總是比較好的。

0

有兩種可能性,因此這個問題在我的iOS設備經常發生。規則#1:不要在[init]函數中調用任何與視圖相關的設置,所有視圖相關的設置必須在viewDidLoad和viewWillAppear中完成。

規則2:檢查viewDidLoad和viewWillAppear,他們是否調用正確的超級函數?例如viewDidLoad - > super viewDidLoad等。

希望這會有所幫助。

0

在我的情況下,我在viewDidLoad中使用self.view(一次),同時在我的單元測試中調用viewDidLoad。這導致了兩個電話。但是,當我用[testedViewController視圖]替換[testedViewController viewDidLoad]時,雙重調用問題消失了。