2009-02-04 35 views
2

具体而言,我应该怎样处理现在在推入新视图控制器后隐藏的视图?
在我的情况下,我有一个动画正在进行的视图,在视图关闭后继续执行。当您推入新视图时,UINavigationViewController中的根视图会发生什么变化?

是否有一些公认的约定? 我是否从内存中删除了View Controller和View?
Cocoa Touch是否有一个方便的方法来“暂停”视图(和控制器)并将其从内存中移除,并在需要时(弹出后)将其恢复生成? 我是否必须自己归档,然后取消归档?

有没有可以指点我的例子?

感谢

回答

2

在内存不足的情况,您的控制器的“视图”特性将被自动设置为nil,如果它不是在屏幕上。然后视图会在需要时自动加载 - 而viewDidLoad应该在那个时候被调用。

如果你的视图控制器保留了顶层视图的任何子视图,那么你可能想覆盖视图控制器的setView:方法,检查视图是否设置为零,如果是,发布子视图,你正在保留。否则,顶级视图可能永远不会被释放。

- (void)setView:(UIView *)view 
{ 
    [super setView:view]; 
    if (view == nil) 
    { 
     // Release other views 
     // self.someView = nil; 
    } 
} 
+0

viewDidLoad只会被调用一次。仅当视图弹出并且不再位于navcontroller的viewcontrollers列表中时,该视图才会设置为零。 – lostInTransit 2009-02-07 09:37:57

3

另一种可能的解决方案是实现两个以下方法:

– viewWillAppear: 
– viewDidAppear: 
– viewWillDisappear: 
– viewDidDisappear: 

你可能会停止你的动画viewWillDisappearviewDidDisappear,然后在viewWillAppearviewDidAppear重新启动它。在停止之前,您还可以存储有关动画的任何必要状态信息。

1

无论何时调用pushViewController,当前视图控制器都通过导航控制器存储在一个数组中(这可以使用navcontroller的viewControllers属性进行访问)。

认为它是一个堆栈。当你调用pushViewController时,一个新的viewcontroller被添加到当前视图控制器之上的堆栈中。但是你的rootviewcontroller仍然在内存中。当你调用popViewController时,该viewcontroller被从堆栈中移除并释放。

因此,如果您想在视图消失时停止动画,请使用Andy建议的viewWillDisappear方法。

相关问题