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