关于viewController的“viewDidLoad”和“viewWillAppear”方法

时间:2013-06-28 10:02:16

标签: ios uiviewcontroller viewdidload viewwillappear

我对这两个提到的方法有一个问题,因为在我的测试中,我没有说清楚他们被称为的顺序。我认为,首先,当第一次加载viewController时(如名称所示),并且在init方法之后立即调用viewDidLoad。然后,我认为一旦viewDidLoad返回,就会调用viewWillAppear。如果你显示另一个viewController,然后你返回到那个,那么它应该已经加载,只会调用viewWillAppear

然而,在开发过程中,我给人的印象是在调用viewDidLoadviewWillAppear时没有顺序...我在Apple的文档中找不到这个生命周期的清晰描述,这是怎么回事?实际上工作?

谢谢!

5 个答案:

答案 0 :(得分:19)

我想补充一下Caleb的答案:不要混淆视图控制器和视图!名称viewDidLoad清楚地表明在加载视图后调用该方法。正是视图控制器进行加载。

关于视图生命周期和消息发送顺序的一些指示:

  • 不是正式的Apple文档,但我发现this diagram非常有用,因为它包含了UIViewController几乎所有的生命周期覆盖。
  • 在Apple的“View Controller Programming Guide”的Resource Management in View Controllers部分中,有一个流程图,描述了最初如何加载视图。它解释了loadViewviewDidLoad,也与故事板结合使用。
  • Apple的“View Controller编程指南”中的Responding to Display-Related Notifications部分解释了如何回应出现和消失的视图(viewWillAppear:等)
  • 如果您计划实现容器视图控制器:UIViewController class reference可以很好地概述子类需要如何发送消息。

我在这里停下来。您可以通过Google搜索“uiviewcontroller生命周期”找到更多内容。

答案 1 :(得分:9)

当控制器加载其视图时,会调用

-viewDidLoad,这在初始化后不一定正确。视图控制器在他们需要之前不会加载他们的视图,无论是显示还是出于任何其他原因。

在显示视图之前调用

-viewWillAppear。这将在-viewDidLoad之后,但你不确切知道多久之后。每次显示视图时都会调用-viewWillAppear;如果视图在某个时刻(例如didReceiveMemoryWarning)被卸载,则-viewDidLoad将仅被第二次调用。这些日子很不寻常,但可能会发生。

或者,如果viewController设置为nil,这通常会在视图控制器从导航堆栈中启动时发生,因此下次将其带到导航堆栈时,需要调用{{1}再次。

答案 2 :(得分:3)

  

我认为,首先,在viewController时调用viewDidLoad   第一次加载(如名称所示),并在init方法之后立即加载

没有。该名称表示已加载控制器view(不是控制器本身)。实际上,文档声明在将视图层次结构加载到内存后(例如,通过loadView或通过nib)将调用此方法。

  

然后,我认为一旦viewDidLoad返回,viewWillAppear就是   称为

再一次,没有。 loadView(并且因此viewDidLoad)方法将在第一次访问view属性时调用,并且nil(当你是{I}时)初始化控制器)。想想这个简单的场景:

MyViewController *vc = [[MyViewController alloc] init];
UIView *view = vc.view; // <= loadView & viewDidLoad will fire but it certainly didn't appear...
  

然而,在开发过程中我给人的印象是没有订单   在调用viewDidLoad和viewWillAppear ...

有订单。我们确信viewWillAppear将始终在viewDidLoad之后调用(如果要同时调用它们的话)。

答案 3 :(得分:1)

正如您所说, ViewDidLoad 仅在加载视图后调用一次。因此,我们可以在 viewDidLoad 中初始化实例。它主要用于初始化。

每当我们到达此视图时,

viewWillAppear 都会调用。因此,如果UI中有任何更改,我们可以在 viewWillAppear 中完成。

答案 4 :(得分:0)