关于viewController的“viewDidLoad”和“viewWillAppear”方法
我有两个提到的方法有一个问题,因为在我的testing中,我不清楚它们被调用的顺序。 我认为,首先, viewDidLoad
是在第一次加载viewController(如名称所示)时调用的,并在init方法之后立即调用。 然后,我想,一旦viewDidLoad
返回, viewWillAppear
被调用。 如果你显示另一个viewController,然后你返回到这个,那么它应该已经加载,只有viewWillAppear
将被调用。
然而,在开发过程中,我给人的印象是调用viewDidLoad
和viewWillAppear
时没有顺序…我不能在Apple的文档中find这个生命周期的清晰描述,这实际上是如何工作的?
谢谢!
我想补充Caleb的答案:不要混淆视图控制器和视图! 名称viewDidLoad
清楚地表明该方法在视图加载后被调用。 这是视图控制器,进行加载。
关于视图的生命周期和消息发送顺序的一些指针:
- 不是一个官方的苹果文件,但我觉得这个图真的很有用,因为它包含了几乎所有的
UIViewController
的生命周期覆盖。 - 在苹果的“视图控制器编程指南”的视图控制器中的资源pipe理一节中,有一个stream程图,描述了如何加载视图。 它解释了
loadView
和viewDidLoad
,还与故事板一起使用。 - 苹果的“视图控制器编程指南”中的“ 响应显示相关通知 ”部分解释了如何响应出现和消失的视图(
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
- 我们怎样才能在iOS中的UInavigationBar插入多个标题
- PFLogInViewController不再被识别?
- 在iOS中为UIImageView的圆形蒙版设置动画
- AVAudioRecorder和AirPlay Mirrioring
- 核心数据示例,无效更新:部分0中的行数无效
- 如何使用CFNotificationCenterGetDarwinNotifyCenter()发送一个userInfo字典
- 如何确定GMSMarker是否位于GMSPolygon(iOS Google Map SDK)
- Apple Watch应用程序检测苹果手表是否与手机配对
- iOS应用内购买沙箱testing帐户不断popupvalidation