【问题标题】:How to use didReceiveMemoryWarning in UINavigationController stack如何在 UINavigationController 堆栈中使用 didReceiveMemoryWarning
【发布时间】:2011-07-16 16:53:53
【问题描述】:

我的应用在堆栈中有多个 UIViewController(在 UINavigationController 下)。在某些情况下,当我在内部 UIViewControllers 中时,我会收到内存警告(通常在设备因后台运行的其他应用程序而过载时发生)。当这些内存警告发生时,应用程序会继续运行(大多数情况下),然后当它返回到 rootViewController 时,它会重新加载它,但不会填充视图对象(主要是 UIButton 图像)。

我希望实现didReceiveMemoryWarning 和applicationDidReceiveMemoryWarning,但我不清楚如何实现。

我正在寻找的最终结果是,当应用程序在内存警告后执行此“重新加载”时,它将“重新加载”rootViewController,处于与用户开始“潜入”内部 UIViewControllers 之前相同的状态。

  • 应该如何实现?
  • 我应该在每个 UIViewController 中实现默认的didReceiveMemoryWarning 吗?
  • 由于内存警告总是发生在内部 UIViewControllers 中,我应该如何让 rootViewController 知道它应该运行 didReceiveMemoryWarning?
  • 我如何告诉rootViewController 它应该进行哪些设置?换句话说 - 我可以将设置保留在 didReceiveMemoryWarning 不会删除它们的地方,并在激活 didReceiveMemoryWarning 时“召回”它们,以便用户看到他们开始“关卡导航”的屏幕吗?

【问题讨论】:

    标签: ios cocoa-touch didreceivememorywarning


    【解决方案1】:

    UINavigationController 堆栈上的任何不可见视图控制器都将转储其视图。它还会向您发送警告。如果视图控制器持有大型数据结构,则应尽可能转储这些数据结构。

    根(另一个)控制器应该适当地处理viewDidUnload,并且能够循环通过另一个loadView/viewDidLoad 阶段。

    如果您希望状态相同,则需要保留所有这些信息。 NSUserDefaults 是执行此操作的标准位置。

    【讨论】:

    • 1.那么您对 ​​UINavigationController 堆栈的看法是,当我在堆栈的第三个视图中时,系统会转储第二个视图?
    • 2.我应该如何在根视图中执行? didReceiveMemoryWarning 的出发点是什么?我应该从 didReceiveMemoryWarning 中调用 loadView 吗?
    • 1.是的。 2.绝对不要从didReceive…调用loadView,你不应该调用loadView,只执行它。根视图控制器只是堆栈上的另一个视图控制器
    • 好的,知道了。还有一件事,如果我想在 didReceiveMemoryWarning 生效之前(即在它调用 viewDidLoad 之前)保存一些数据,那么应用程序将使用它在内存警告发生之前保存的数据重新加载根视图。知道怎么做吗?
    • 通常使用NSUserDefaults 来存储表格视图滚动到的位置和/或其选择的位置,当您收到viewDidLoad 时,您可以重置该状态
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多