2013-03-11 19 views
8

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

+0

viewDidAppear必须被调用。尝试把NSLog,而不是如果你正在检查断点 – 2013-03-11 05:48:43

+1

'viewDidAppear'总是被我的应用程序调用。确保在你调用'[super viewWillAppear:animated]''的'viewWillAppear:'方法中。也可以在其他方法中调用正确的[super xxx]。 – rmaddy 2013-03-11 05:53:32

回答

15

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

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

viewDidLoad只有当viewControllers视图加载到内存中时才会调用。因为 是从内存中清除了一些低内存的原因时,需要显示

  • 有时当的viewController需要重新装入

    1. 第一次认为它会做。

    在你的情况下,当你回弹的时候,viewController已经被加载了,所以不需要再次调用viewDidLoad

  • +0

    yaa ok我知道了......但为什么不'viewDidAppear'和'viewDidLoad' – Christien 2013-03-11 05:37:11

    +0

    @Christien请参阅编辑 – Krishnabhadra 2013-03-11 05:42:45

    +0

    好吧然后在你的情况下..'viewWillAppear'和'ViewDidAppear'应该被称为ryt ...但是' viewWillAppear'只叫'不叫'ViewDidAppear' – Christien 2013-03-11 05:51:23

    2

    我没有一个完整的答案给你,但我希望这有助于。

    viewDidLoad是加载事件发生后修改视图的回调函数。在你的情况下,视图已经加载。它不在意的事实并不意味着它已从记忆中卸载。

    viewDidAppear:虽然我不知道为什么这个事件没有发射,并且如果有其他人填补这个空白,会很开心。

    12

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

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

    注意通过Abizern从评论:这是真实的的iOS5和更早版本。 iOS6不再卸载视图。

    +2

    添加从哪里得到这个屏幕截图的参考:) – 2013-03-11 05:31:43

    +0

    亚,但没有得到逻辑Ÿ只有'viewWillAppear'将被调用导航回...没有其他 – Christien 2013-03-11 05:35:26

    +0

    因为当你回到那个视图控制器已经创建。 viewDidLoad只在已经创建的时候调用它才会触发。 ViewWill在每次屏幕显示时都会调用。 – 2013-03-11 05:40:21

    3

    首先,很好的问题@ user2102546。在此处签出您查询的完美理由。

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

    通常情况下,如果您使用导航控制器,并使用其中一种弹出方法回到以前的视图,则可使用viewDidLoad does not get called again, because the view are not unloaded yet

    然而,系统可以卸载任何视图控制器的视图,当视图控制器不是最前面的时候,为了释放内存,所以viewDidLoad可以在视图控制器即将呈现时随时调用。您需要编写代码以正确响应不同的事件。

    享受编程!

    +0

    如果我们考虑Hasintha的上面的图片和你的答案...'viewDidLoad不会被再次调用,因为视图还没有被卸载.'罚款..'viewdidload不会称为未卸载,但viewWillAppear和ViewDidAppear都应该被称为' – Christien 2013-03-11 05:46:25

    +0

    @Christien,是的,这两个viewWillAppear&ViewDidAppear,都将在导航返回时调用。 – 2013-03-11 05:53:28

    相关问题