从堆栈弹出后,如何将视图控制器保留在内存中?

时间:2013-08-23 19:13:46

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

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

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

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

那么我怎样才能有效地执行self.temporaryMainViewController = self.currentCenterViewController;,其中temp控制器是按对象的值而不是地址的值来分配的?

- 编辑 - 更多信息:

ECSlidingViewController保留(在我的情况下)内存中的3个控制器 - 顶部/中央/主视图控制器,左隐藏控制器和右隐藏控制器。我的左隐藏控制器是一个tableview LeftMenuTableViewController,其中每一行,如果被选中,则观察我与该indexPath关联的视图控制器类,然后实例化该类的实例并通过简单的赋值将其设置为topViewController声明。我想在将新视图控制器分配给顶视图时,仅将我的初始顶视图控制器(类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的一些明显的原则,但这给了一些麻烦。如果我没有说清楚,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

希望这有帮助! 干杯!