8

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

4

4 回答 4

18

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

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

viewDidLoad仅在 viewControllers 视图加载到内存中时调用。什么时候做

  1. 第一次需要显示视图
  2. 有时当 viewController 需要重新加载时,因为某些内存不足的原因它被从内存中清除。

在您的情况下,当您弹回时,viewController 已经加载,因此无需viewDidLoad再次调用。

于 2013-03-11T05:33:20.973 回答
13

ios ui 的完整生命周期在这里解释。在此处输入图像描述

http://www.verydemo.com/demo_c134_i4568.html

来自评论的Abizern注释:这适用于 iOS5 及更早版本。iOS6 不再卸载视图。

于 2013-03-11T05:29:31.117 回答
3

首先,很好的问题@user2102546。在这里结帐是您查询的完美理由。

viewDidLoad 只有在视图控制器的视图被卸载并且需要重新加载时才会被调用。

通常,如果您使用导航控制器,并使用其中一种弹出方法返回上一个视图,viewDidLoad does not get called again, because the view are not unloaded yet.

但是,系统可以在任何视图控制器不在最前面时卸载它的视图以释放内存,因此 viewDidLoad 可以在视图控制器即将出现的任何时候被调用。您需要编写代码以正确响应不同的事件。

享受编程!!

于 2013-03-11T05:38:49.533 回答
2

我没有完整的答案给你,但我希望这会有所帮助。

viewDidLoad 是一个回调,用于在加载事件发生后修改视图。在您的情况下,视图已经加载。它不在视图中的事实并不意味着它已从内存中卸载。

viewDidAppear:虽然我不知道为什么这个事件没有触发,如果其他人能填补这个空白我会很高兴。

于 2013-03-11T05:28:46.603 回答