我怀疑需要清楚..我有堆栈和导航控制器。当堆栈加载时,viewDidLoad
viewWillAppear
viewDidAppear
将被调用。当我点击某个按钮然后这个按钮将我推到新的堆栈,现在新的堆栈给了我后面的选项..当我点击导航控制器的背面时..为什么只会调用viewWillAppear
..为什么不是viewDidLoad
而不是viewDidAppear
答案 0 :(得分:17)
堆栈是后进先出(LIFO),因此当您将新视图控制器推送到堆栈时,先前的视图控制器不会被破坏(并且它们保留在内存中)。当您弹回时,不需要重新创建Viewcontroller,因为它已经在内存中。因此只会调用viewWillAppear
。
至于为什么viewDidAppear
在这种情况下不被调用,我不记得我在哪里读过这个,但是在你的UIViewController视图被添加到应用程序的UIWindow层次结构后调用了viewDidAppear
。这个过程是在第一次显示UIViewController之前完成的。
viewDidLoad
仅在viewControllers视图加载到内存时调用。它将在
在您的情况下,当您弹回时,viewController已经加载,因此无需再次调用viewDidLoad
。
答案 1 :(得分:13)
ios的完整生命周期ui在这里解释。
http://www.verydemo.com/demo_c134_i4568.html
注意Abizern来自评论:对于iOS5及更早版本,这是正确的。 iOS6不再卸载视图。
答案 2 :(得分:3)
首先,好问题@ user2102546。在这里查看您查询的完美原因。
只有在卸载视图控制器的视图时才会调用viewDidLoad,并且需要重新加载。通常情况下,如果您使用导航控制器,并使用其中一种流行方法返回上一个视图, viewDidLoad does not get called again, because the view are not unloaded yet
。
但是,系统可以卸载任何视图控制器的视图,当它不在最前面以释放内存时,因此只要呈现视图控制器,就可以调用viewDidLoad。您需要编写代码以正确响应不同的事件。
享受编程!!
答案 3 :(得分:2)
我没有完整的答案,但我希望这有帮助。
viewDidLoad是在load事件发生后修改视图的回调。在您的情况下,视图已加载。它不在视野中的事实并不意味着它已从内存中卸载。
viewDidAppear:虽然我不知道为什么这个事件没有解雇,但如果其他人填补这个空缺,我会很高兴。