我有疑问需要清楚..我有堆栈和导航控制器。现在当堆栈加载viewDidLoad
viewWillAppear
viewDidAppear
将被调用。当我点击一些按钮,然后这个按钮把我推到新的堆栈,现在新的堆栈给了我后面的选项..现在,当我点击导航控制器的背面..为什么只有viewWillAppear
将被称为..为什么不viewDidLoad
而不是viewDidAppear
为什么只有viewWillAppear调用导航回
回答
栈是后进先出(LIFO),所以当你将新的视图控制器推送到堆栈时,以前的viewcontroller不会被销毁(并且它们保留在内存中)。当您回弹时,无需重新创建Viewcontroller,因为它已经在内存中。所以只有viewWillAppear
被调用。
至于为什么viewDidAppear
在这种情况下没有被调用,我不记得我在哪里读过这个,但是当你的UIViewController的视图被添加到应用程序的UIWindow层次后,viewDidAppear
被调用。这个过程是在UIViewController第一次显示之前完成的。
viewDidLoad
只有当viewControllers视图加载到内存中时才会调用。因为 是从内存中清除了一些低内存的原因时,需要显示
- 第一次认为它会做。
在你的情况下,当你回弹的时候,viewController已经被加载了,所以不需要再次调用viewDidLoad
。
yaa ok我知道了......但为什么不'viewDidAppear'和'viewDidLoad' – Christien 2013-03-11 05:37:11
@Christien请参阅编辑 – Krishnabhadra 2013-03-11 05:42:45
好吧然后在你的情况下..'viewWillAppear'和'ViewDidAppear'应该被称为ryt ...但是' viewWillAppear'只叫'不叫'ViewDidAppear' – Christien 2013-03-11 05:51:23
我没有一个完整的答案给你,但我希望这有助于。
viewDidLoad是加载事件发生后修改视图的回调函数。在你的情况下,视图已经加载。它不在意的事实并不意味着它已从记忆中卸载。
viewDidAppear:虽然我不知道为什么这个事件没有发射,并且如果有其他人填补这个空白,会很开心。
ios ui的完整生命周期在这里解释。
http://www.verydemo.com/demo_c134_i4568.html
注意通过Abizern从评论:这是真实的的iOS5和更早版本。 iOS6不再卸载视图。
添加从哪里得到这个屏幕截图的参考:) – 2013-03-11 05:31:43
亚,但没有得到逻辑Ÿ只有'viewWillAppear'将被调用导航回...没有其他 – Christien 2013-03-11 05:35:26
因为当你回到那个视图控制器已经创建。 viewDidLoad只在已经创建的时候调用它才会触发。 ViewWill在每次屏幕显示时都会调用。 – 2013-03-11 05:40:21
首先,很好的问题@ user2102546。在此处签出您查询的完美理由。
viewDidLoad只有在视图控制器的视图被卸载并且需要重新加载时才会被调用。
通常情况下,如果您使用导航控制器,并使用其中一种弹出方法回到以前的视图,则可使用viewDidLoad does not get called again, because the view are not unloaded yet
。
然而,系统可以卸载任何视图控制器的视图,当视图控制器不是最前面的时候,为了释放内存,所以viewDidLoad可以在视图控制器即将呈现时随时调用。您需要编写代码以正确响应不同的事件。
享受编程!
如果我们考虑Hasintha的上面的图片和你的答案...'viewDidLoad不会被再次调用,因为视图还没有被卸载.'罚款..'viewdidload不会称为未卸载,但viewWillAppear和ViewDidAppear都应该被称为' – Christien 2013-03-11 05:46:25
@Christien,是的,这两个viewWillAppear&ViewDidAppear,都将在导航返回时调用。 – 2013-03-11 05:53:28
- 1. 为什么viewWillAppear没有被调用?
- 2. 为什么viewWillAppear不会被调用?
- 3. 为什么导航控制器不使用Swift在回调中导航?
- 4. viewWillAppear只被调用一次
- 5. 什么时候ViewWillAppear被调用?
- 6. 在什么情况下viewWillAppear被调用?
- 7. 为什么Apple建议我们不要调用viewWillLoad,viewWillAppear,viewDidDisappear等?
- 8. 为什么viewDidLoad在viewWillAppear之前被调用?
- 9. 为什么viewDidAppear/viewWillAppear不会在嵌套结构中调用?
- 10. 为什么我必须调用viewWillAppear来获取cellForRowAtIndexPath?
- 11. 当我使用presentModelViewController时,为什么viewWillAppear没有在我的UITabBArController中调用?
- 12. UITabViewController,viewWillAppear没有被调用?
- 13. ViewWillAppear没有被UISplitViewController调用
- 14. 为什么当我导航回页面时,组件构造函数被调用?
- 15. 为什么我的回调只在一页上被调用?
- 16. 为什么返回值只有南?
- 17. 为什么只有debian返回127.0.0.1
- 18. viewWillAppear和viewDidAppear不调用,而viewDidLoad调用什么时在UIViewController
- 19. 导航栏显示隐藏它viewWillAppear中
- 20. jquery我完成的回调只有一次调用我不明白为什么
- 21. 为什么调用ProcessGroupPolicyEx回调会导致访问冲突?
- 22. 导航对象为空;为什么?
- 23. 为什么ADBannerView只在iOS 6上显示导航栏顶部
- 24. viewDidLoad中调用只一次在导航
- 25. 覆盖导航只能调用finish();
- 26. 为什么viewWillAppear不是调用,而是将另一个ViewController作为FormSheet使用
- 27. chrome.webstore.install调用两个回调?为什么?
- 28. 为什么回调函数被调用?
- 29. 为什么“错误:”回调被调用
- 30. 为什么GoogleAuth.then()停止调用回调?
viewDidAppear必须被调用。尝试把NSLog,而不是如果你正在检查断点 – 2013-03-11 05:48:43
'viewDidAppear'总是被我的应用程序调用。确保在你调用'[super viewWillAppear:animated]''的'viewWillAppear:'方法中。也可以在其他方法中调用正确的[super xxx]。 – rmaddy 2013-03-11 05:53:32