6

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

viewDidLoad但是,在开发过程中,我给人的印象是调用时没有顺序viewWillAppear......我在 Apple 的文档中找不到这个生命周期的明确描述,这实际上是如何工作的?

谢谢!

4

5 回答 5

20

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

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

我停在这里。您可以通过谷歌搜索“uiviewcontroller 生命周期”自己找到更多内容。

于 2013-06-28T10:18:55.903 回答
9

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

-viewWillAppear在视图显示之前调用。这将在 之后-viewDidLoad,但您不知道确切的时间。-viewWillAppear每次显示视图时调用;如果视图在某个时候被卸载(例如didReceiveMemoryWarning-viewDidLoad,只会被第二次调用。这些天这是不寻常的,但它可能会发生。

或者如果 viewController 设置为nil,这通常会在视图控制器被踢出导航堆栈时发生,因此下次将其带到导航堆栈时需要-viewDidLoad再次调用。

于 2013-06-28T10:08:48.487 回答
3

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

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

然后,我认为一旦 viewDidLoad 返回, viewWillAppear 就会被调用

再次,不。loadView(因此viewDidLoad)方法将在第一次访问该view属性时被调用,并且是nil(当您初始化控制器时就是这种情况)。想想这个简单的场景:

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

但是,在开发过程中,我觉得调用 viewDidLoad 和 viewWillAppear 时没有顺序...

好吧,有一个命令。我们肯定知道它viewWillAppear总是会被调用viewDidLoad(当然,如果它们都被调用)。

于 2013-06-28T10:35:44.833 回答
1

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

viewWillAppear将在我们到达该视图时调用。因此,如果 UI 有任何变化,我们可以在viewWillAppear中完成。

于 2013-06-28T10:10:16.980 回答
0

我跟踪了所有这些调用的时间:http: //thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace

于 2013-06-28T13:07:24.100 回答