为什么只有viewWillAppear调用导航回来

时间:2013-03-11 05:23:39

标签: iphone ios uinavigationcontroller viewcontroller

我怀疑需要清楚..我有堆栈和导航控制器。当堆栈加载时,viewDidLoad viewWillAppear viewDidAppear将被调用。当我点击某个按钮然后这个按钮将我推到新的堆栈,现在新的堆栈给了我后面的选项..当我点击导航控制器的背面时..为什么只会调用viewWillAppear ..为什么不是viewDidLoad而不是viewDidAppear

4 个答案:

答案 0 :(得分:17)

堆栈是后进先出(LIFO),因此当您将新视图控制器推送到堆栈时,先前的视图控制器不会被破坏(并且它们保留在内存中)。当您弹回时,不需要重新创建Viewcontroller,因为它已经在内存中。因此只会调用viewWillAppear

至于为什么viewDidAppear在这种情况下不被调用,我不记得我在哪里读过这个,但是在你的UIViewController视图被添加到应用程序的UIWindow层次结构后调用了viewDidAppear。这个过程是在第一次显示UIViewController之前完成的。

viewDidLoad仅在viewControllers视图加载到内存时调用。它将在

时完成
  1. 第一次需要显示视图时
  2. 有时当viewController需要再次重新加载时,因为 它因内存不足而被从内存中清除。
  3. 在您的情况下,当您弹回时,viewController已经加载,因此无需再次调用viewDidLoad

答案 1 :(得分:13)

ios的完整生命周期ui在这里解释。enter image description here

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:虽然我不知道为什么这个事件没有解雇,但如果其他人填补这个空缺,我会很高兴。