【问题标题】:How can I keep a view controller in memory after its popped from the stack?从堆栈中弹出后,如何将视图控制器保留在内存中?
【发布时间】:2023-04-11 04:47:02
【问题描述】:

这是一个简单得令人尴尬的问题,但我需要保留一个视图控制器,而我目前的解决方案不是解决方案。

我有一个滑出的表格视图菜单,让我可以选择一个新的视图控制器来推到最前面。当我选择一个视图时,它会释放旧的主视图控制器以推送新的主视图控制器。由于我 90% 的功能都围绕一个视图控制器,我希望它保留在内存中,这样我就不必经常花费资源来分配它,也不必从核心数据中提取最后一个数据源或发出网络请求。

我天真地尝试设置一个占位符 temporaryMainViewController 并将其分配给我的中心视图控制器,然后再分配另一个 VC,但是将当前主视图控制器分配给 temporaryMainViewController 只是分配主视图控制器的地址-所以当它改变时,我的 tempVC 也是如此。 尝试copy 视图控制器会导致崩溃。

那么我怎样才能有效地做到self.temporaryMainViewController = self.currentCenterViewController;,其中临时控制器是由对象的值而不是地址的值分配的?

-- 编辑-- 更多信息:

ECSlidingViewController 在内存中保留(在我的情况下)3 个控制器——顶部/中心/主视图控制器、左隐藏控制器和右隐藏控制器。我的左侧隐藏控制器是一个表视图 LeftMenuTableViewController ,其中每一行在被选中时都会观察我与该 indexPath 关联的视图控制器类,然后实例化该类的一个实例并使用简单的赋值语句将其设置为 topViewController。当一个新的视图控制器分配给顶视图时,我只想在内存中保留我的 initial 顶视图控制器(属于 PlacesNavigationViewController 类(包含 PlacesTableViewController))。

我的第一种方法是在 LeftMenuTableViewController 中声明一个占位符属性,因为它本身永远不会离开内存。

@property (nonatomic, strong) UIViewController* temporaryViewController;

然后在didSelectRowAtIndexPath:

// make local variables for storyboard and the identifier of the view controller that will be pushed, then..
self.temporaryViewController = self.topViewController;
self.topViewController = [storyboard instantiateViewControllerWithIdentifier:newViewControllerIdentifier];

但这失败了,因为临时控制器被分配了 topViewController 的内存地址——在下一行中,它被赋予了一个新的视图控制器来保存。

所以我需要一种方法来保存topViewController 的内容,这样当topViewController 发生变化时,我的内存中仍然有旧的VC。

我可能忘记了 Objective-C 的一些明显原则,但这会带来很多麻烦。如果我没有说清楚,请告诉我。

【问题讨论】:

  • 也许我错过了明显的,但为什么不保留它呢?
  • 是的,[vc retain] 完成了这项工作。 (在 ARC 下等效:保留对它的 strong 引用。)
  • 确实对它有强烈的参考。但是当我将一个新对象分配给顶视图控制器时,tempViewController 仍然指向 topVC 后面的内存地址中的任何内容。
  • 您需要提供更多上下文和代码,以便人们能够帮助您。告诉我们您的控制器层次结构将是一件有用的事情。
  • 我不知道 ECSlidingViewController 是否有问题,但是将temporaryVC 设置为self.topVC,然后将topVC 重新分配给另一个控制器,不应该让topVC 和temporaryVC 指向同一个东西。

标签: ios objective-c pass-by-value


【解决方案1】:

您想使用 UINavigationController 类的viewControllers 属性。文档是here。基本上,您可以在 viewControllers 数组中交换 2 个视图控制器,然后使用 setViewControllers:animated: 进行转换。

希望这会有所帮助! 干杯!

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多