我对这两个提到的方法有一个问题,因为在我的测试中,我没有说清楚他们被称为的顺序。我认为,首先,当第一次加载viewController时(如名称所示),并且在init方法之后立即调用viewDidLoad
。然后,我认为一旦viewDidLoad
返回,就会调用viewWillAppear
。如果你显示另一个viewController,然后你返回到那个,那么它应该已经加载,只会调用viewWillAppear
。
然而,在开发过程中,我给人的印象是在调用viewDidLoad
和viewWillAppear
时没有顺序...我在Apple的文档中找不到这个生命周期的清晰描述,这是怎么回事?实际上工作?
谢谢!
答案 0 :(得分:19)
我想补充一下Caleb的答案:不要混淆视图控制器和视图!名称viewDidLoad
清楚地表明在加载视图后调用该方法。正是视图控制器进行加载。
关于视图生命周期和消息发送顺序的一些指示:
UIViewController
几乎所有的生命周期覆盖。loadView
和viewDidLoad
,也与故事板结合使用。viewWillAppear:
等)我在这里停下来。您可以通过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)