【问题标题】:What happens to the root view in UINavigationViewController when you push on a new view?当您推送新视图时,UI NavigationViewController 中的根视图会发生什么情况?
【发布时间】:2009-02-04 06:35:55
【问题描述】:

具体来说,我应该如何处理在推送新视图控制器后现在隐藏的视图?
在我的情况下,我有一个动画正在进行的视图,在视图离开屏幕后继续执行。

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

你有什么例子可以指点我吗?

谢谢

【问题讨论】:

    标签: iphone cocoa-touch memory-management


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      在内存不足的情况下,如果控制器的“view”属性不在屏幕上,它会自动设置为 nil。然后视图将在需要时再次自动加载 - 届时应该调用 viewDidLoad。

      如果您的视图控制器保留了顶级视图的任何子视图,那么您可能需要覆盖视图控制器的 setView: 方法,检查视图是否设置为 nil,如果是,则释放您之前的子视图保留。否则,顶级视图可能永远不会被释放。

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

      【讨论】:

      • viewDidLoad 只会被调用一次。仅当视图被弹出并且不再在导航控制器的视图控制器列表中时,视图才被设置为 nil。
      • 您不需要覆盖 -setView 方法。为您提供了回调方法 -viewDidUnload 来执行您提到的任务。 viewController 的 view 属性仅在内存不足的情况下设置为 nil,如果没有发生,则在 pop 操作后将相同的视图呈现给用户。我不确定动画是否由系统智能处理,因为当推送新的 viewController 时,rootViewController 的视图不再位于窗口视图层次结构中。
      【解决方案3】:

      每当你调用 pushViewController 时,当前的 viewcontroller 都会被导航控制器存储在一个数组中(这可以使用 navcontroller 的 viewControllers 属性来访问)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 2022-10-28
        • 2019-10-16
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多