这是一个令人尴尬的简单问题,但我需要保留一个视图控制器,而我目前的解决方案不是解决方案。
我有一个幻灯片表视图菜单,可以让我选择一个新的视图控制器来推送到最前端。当我选择一个视图时,它会释放旧的主视图控制器以推送新的视图。由于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的一些明显的原则,但这给了一些麻烦。如果我没有说清楚,请告诉我。
答案 0 :(得分:0)
您想使用UINavigationController类的viewControllers
属性。文档是here。基本上,您只需在viewControllers数组中交换2个视图控制器,然后使用setViewControllers:animated:
进行转换。
希望这有帮助! 干杯!