2013-03-10 84 views
1

我知道在UIViewController的生命週期中可能會多次調用viewDidLoad方法。但這怎麼可能?如何使它不止一次被調用,而不是直接調用它?我試圖做這樣說:如何讓viewDidLoad多次調用

UIView *view = [[UIView alloc] initWithFrame:self.view.frame]; 

view.backgroundColor = [UIColor greenColor]; 

self.view = view; 

和而我的看法是實際改變,viewDidLoad不叫。任何人都可以舉個例子嗎?

回答

3

您訪問的viewController的view財產的觀點將與loadView創建,然後你會收到viewDidLoad第一時間致電。

您將不會再收到viewDidLoad呼叫,除非該視圖被破壞 - 如果你的viewController熄滅屏幕,UIKit決定清除任何觀點的不可見的,這可能會發生。因此,下次您訪問view屬性時,它會發現它不存在,並再次創建一個與loadView,然後致電viewDidLoad

+2

請注意,從iOS 6開始,視圖將不會再被卸載,因此視圖控制器的每個實例只會調用一次loadView/viewDidLoad。 – jrturton 2013-03-10 13:25:46

+0

......根據你對其他答案的評論,你已經知道了。你應該更新答案。 – jrturton 2013-03-10 13:29:33

+0

@jrturton我知道低內存不會導致視圖被清除,所以我只寫了「[如果] ...'UIKit'決定清除」 - 我不知道是否有任何其他情況下'UIKit'將決定丟棄視圖 – 2013-03-10 13:43:37

0

viewWillAppear方法是一個UIViewController方法。爲什麼你不應該直接打電話?

順便問一下有沒有辦法做到這一點,而你分配的UIView你的self.view,ID你沒有做它在init或在的loadView或didLoad方法..

生活週期是:

  • 初始化
  • 的loadView //改變這裏
  • 你的觀點的viewDidLoad

然後你提出的觀點和:

  • viewWillAppear中:
  • viewDidAppear:

如果你希望你的UIViewController生命週期中更改視圖,你應該做的:

UIView *view = [[UIView alloc] initWithFrame:self.view.frame]; 

view.backgroundColor = [UIColor greenColor]; 
[self viewWillAppear:NO]; //set to yes if you are making some kind of animation 
self.view = view; 
[self viewDidAppear:NO]; 

根據UIVIewController的生命週期,將會消失並消失。

+0

根據你對我的答案的編輯(其他人拒絕),這不再適用於iOS 6'在iOS 6上,視圖永遠不會被清除,這些方法永遠不會被調用。「[UIViewController類參考](http ://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html) – 2013-03-10 12:31:32

+0

所以你寫非復古兼容的代碼?在支持iOS 5之前,我的斷言依然如此。您必須編寫類似viewDidLoad的代碼才能再次調用內存警告。 – 2013-03-10 15:07:20

+0

我從來沒有說過要寫出不兼容的代碼,而是選擇陳述「UIKit」是否決定清除視圖,而不是明確指出何時會發生這種情況。 – 2013-03-10 19:32:31