【问题标题】:How can I manage the potential endless pushing of view controllers onto the navigation controller stack? iOS如何管理视图控制器潜在的无休止推送到导航控制器堆栈上? iOS
【发布时间】:2014-01-07 03:06:52
【问题描述】:

我有一个由 UINavigationController 组成的应用程序,它从 3 个不同的选项卡推送 ViewControllers。

我预见的问题是当前结构允许用户无休止地将 VC 添加到堆栈中。

我有一个名为药物的选项卡和另一个名为病原体的选项卡。如果您深入研究药物,您会得到一份有效对抗的病原体列表,用户可以选择一种病原体以查看有关它的更多信息。这会导致应用程序推送一个新的病原VC。

现在用户可以深入到病原体易感的药物列表并选择它,这会在药物选项卡中产生一个新的 VC。

等等等等……

每次内存占用增加 1.5Mb。

我怎样才能最好地管理这个?

【问题讨论】:

  • 内存从何而来?您应该在不使用时重用/卸载这些资源(可见)。
  • 你只是在这两个标签之间切换吗?如果是这样,当从病原体返回药物时,您可以关闭当前的视图控制器。
  • VC 是 UITableViewControllers,我假设 navigationcontroller 保留了它们,因此它可以导航回它们与它们离开时相同的状态。不是这样吗?
  • 至于选项卡之间的切换,每个选项卡中都有一个VC的层次结构。虽然我一直在想,如果我确实切换到堆栈上已经有 VC 的选项卡,也许我可以只弹出到该选项卡的根 VC? (不知道这是怎么做到的)

标签: ios objective-c memory uiviewcontroller uinavigationcontroller


【解决方案1】:

您应该专注于最大限度地减少内存占用,方法是释放可以轻松重新创建的资源,而不是试图阻止用户将 100 个视图控制器推送到您的堆栈中。苹果也不这样做。

打开“iTunes Store”应用并搜索“Hugh Laurie”,选择专辑“Let Them Talk”,然后选择“Hugh Laurie >”,然后选择“Let Them Talk”,然后选择“Hugh Laurie >”等等。你可以继续前进,继续前进。当用户长时间这样做时,应用程序可能会耗尽内存并崩溃。

如果您尝试将 20 吨砖块装载到您的丰田皮卡上,它可能会像空的 Capri Sun 包一样被压碎。这是故意破坏性行为,恕我直言,如果用户强行尝试超载,应用程序终止是可以的。

但是,您可以通过释放屏幕外视图控制器中的内存来使这一点几乎无法到达,因此这种情况不太可能发生。实施didReceiveMemoryWarning(例如:How to implement didReceiveMemoryWarning?)以发布您可以轻松地从磁盘或网络重新创建的东西(图像、核心数据对象等)。这样,您可以减少内存占用,并且您的用户只有在他们手头有几个小时并且没有比推送视图控制器更好的事情时才能让您的应用程序崩溃。这会很伤心。

【讨论】:

  • 那辆卡车看起来就像我去家得宝旅行的捷达!关于故意破坏性行为的观点。仅仅为了适应悲伤的 VC 推送器的边缘情况而限制可能 100% 的情况下的导航将是一种耻辱。真的,也许那个悲伤的 VC 推动者需要让应用程序崩溃,这样他们才能继续他们的生活......
  • 我基本上可以释放VC中的所有东西,除了一个简单的数据对象,所以这可能会很好用。
  • 所以我试图成为一个悲伤的 VC 推动者,我的大脑无法处理更多的单调,我什至没有接近让应用程序耗尽所有内存。在测试中间回复文本释放了大量内存,然后退出应用程序并返回也释放了很多内存。我认为这里最好的解决方案是相信 iOS 在需要时可以很好地释放内存。我还将寻找逻辑位置来清除 VC 堆栈。感谢您的帮助。
【解决方案2】:

您可以实现自己的UINavigationController 子类。您至少需要实现pushViewController:animated:popViewControllerAnimated:。在推送期间,您将丢弃其中一个视图控制器(从而释放内存),然后在弹出时,您将使用您保留的数据再次创建它。基本上,您将从保留整个视图控制器堆栈切换到仅保留几个元素,并使用逻辑来恢复堆栈中更靠后的元素。

这是一个简化的描述。在实际应用中,您需要至少保留前一个视图控制器,以便您的后退按钮和从边缘滑动的后退手势顺利工作。

【讨论】:

  • navigationcontrollers 是否跟踪 VC 与哪个选项卡相关联?如果是这样,如果我导航回该选项卡,我是否可以不只是弹出所有病原体 VC?编辑:我有些困惑:标签栏控制器和导航控制器,我现在看到每个标签都有自己的导航控制器,这应该会让事情变得更容易
  • 我认为你可以做到,是的。但我认为您担心的是用户在不更改标签的情况下继续深入导航控制器的情况?
  • 确实如此,就目前而言,它们并没有切换标签……只是添加了 VC。也许我需要在推送 VC 之前以编程方式切换选项卡。在查看病原体信息时,应用应显示用户位于病原体选项卡中。
  • 顺便说一句,您可以通过 UIViewController 的 tabBarController 属性访问标签栏控制器。每个 VC 也知道它的导航控制器,因此您可以连接这些点并查看哪个 VC 在哪个选项卡下。
  • “也许我需要在推送 VC 之前以编程方式切换选项卡”——现在这听起来像是一个 hack。如果我正在使用一个应用程序,它突然切换了我的标签,我根本不会欣赏它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多