我正在使用ECSlidingViewController创建一个幻灯片菜单(如Facebook)。
我有这个故事板:
如您所见,我有一个导航控制器。我有一个主要问题,即使由制作该控制器的用户创建的官方演示也未实现:在更改视图然后返回时,它不会保存视图控制器的状态
因此,例如,当我打开应用程序时,橙色视图将始终是第一个视图,它将获得viewDidLoad
。然后我切换到绿色视图(第二个),然后单击按钮。它将该视图的背景颜色更改为红色。然后,如果我回到我的第一个视图,然后回到第二个视图,后者的背景颜色再次变为绿色。我希望它保持红色。
这是我切换视图的代码(在MenuViewController
中):
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Get identifier from selected
NSString *identifier = [NSString stringWithFormat:@"%@", [self.menu objectAtIndex:indexPath.row]];
// Add the selected view to the top view
UIViewController *newTopVC = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
// Present it
[self.slidingViewController anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{
CGRect frame = self.slidingViewController.topViewController.view.frame;
self.slidingViewController.topViewController = newTopVC;
self.slidingViewController.topViewController.view.frame = frame;
[self.slidingViewController resetTopView];
}];
}
正如您所看到的,它每次都会实例化一个新的VC。我希望它保存VC,如果没有创建它,则创建新的,然后显示一个。 如果用户返回到已创建的视图,则应该只恢复已保存的视图,而不是创建新视图。
我已将Init View Controller
放在导航控制器中,现在我该如何为我的视图实现这种保存/恢复机制?我希望它与2,3,4等一起工作......尽可能多的观点。
感谢。
答案 0 :(得分:5)
当你“退回”时,你基本上会从导航堆栈弹出viewcontroller。此时,没有更多对该视图控制器的引用,并且它被取消分配,因此您将丢失所有更改。
您可以通过以下几种方式处理:
1)在父视图控制器(正在呈现的视图控制器)中保持对红色/绿色视图控制器活动的引用,并使用它而不是实例化新的视图控制器。这不是非常友好的,但如果谨慎使用则可以使用。
界面中的:
@property (nonatomic, strong) UIViewController* myGreenController;
然后将实例化更改为
if (!self.myGreenController)
{
self.myGreenController = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
}
...
self.slidingViewController.topViewController = self.myGreenController;
2)理想情况下,实现委托模式以将状态传递回父视图控制器(类似How do I set up a simple delegate to communicate between two view controllers?)。然后下次当你需要viewController时,你可以在呈现之前设置状态。