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

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

然而,在开发过程中,我给人的印象是调用viewDidLoadviewWillAppear时没有顺序…我不能在Apple的文档中find这个生命周期的清晰描述,这实际上是如何工作的?

谢谢!

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

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

  • 不是一个官方的苹果文件,但我觉得这个图真的很有用,因为它包含了几乎所有的UIViewController的生命周期覆盖。
  • 在苹果的“视图控制器编程指南”的视图控制器中的资源pipe理一节中,有一个stream程图,描述了如何加载视图。 它解释了loadViewviewDidLoad ,还与故事板一起使用。
  • 苹果的“视图控制器编程指南”中的“ 响应显示相关通知 ”部分解释了如何响应出现和消失的视图( viewWillAppear:等)
  • 如果你正在计划实现一个容器视图控制器: UIViewController类的引用很好地概述了你的子类如何发送消息。

我在这里停下来 你可以通过search“uiviewcontroller生命周期”来find更多的东西。

-viewDidLoad在控制器加载它的视图时被调用,这在初始化之后不一定是正确的。 视图控制器不会加载视图,直到他们需要它们,显示或出于任何其他原因。

-viewWillAppear在视图显示之前被调用。 这将是after- -viewDidLoad ,但你不知道究竟多久之后。 每次显示视图时都会调用-viewWillAppear ; -viewDidLoad只会在某个时间点(如didReceiveMemoryWarning )被卸载的情况下才被第二次调用。 这些日子不寻常,但可能发生。

或者,如果viewController设置为nil ,这通常会发生在视图控制器从导航堆栈中被移出的情况下,因此下一次将其-viewDidLoad导航堆栈时,需要再次调用-viewDidLoad

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

不。名称表示控制器的view已被加载(不是控制器本身)。 实际上文档声明,这个方法将在视图层次被加载到内存之后被调用(例如通过loadView或者通过笔尖)。

然后,我想,一旦viewDidLoad返回,viewWillAppear被调用

再次,不。 loadView (因此viewDidLoad )方法在第一次被访问的时候会被调用,并且是nil (这是你初始化控制器的情况)。 想想这个简单的场景:

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

然而,在开发过程中,当我调用viewDidLoad和viewWillAppear时,我觉得没有顺序。

那么有一个命令。 我们知道viewWillAppear会在viewDidLoad之后被调用(如果两者都被调用的话)。

正如你所说, ViewDidLoad加载视图后只调用一次。 所以我们可以在viewDidLoad中初始化这些实例。 主要是为了初始化。

viewWillAppear会调用这个视图。 所以如果UI有任何改变,我们可以在viewWillAppear中做。

当所有这些调用完成后,我都会跟踪一下: http : //thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace