2013-03-10 87 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