如何在iOS中保存/恢复视图状态?

swi*_*ode 1 objective-c uiviewcontroller uinavigationcontroller ios

我正在使用ECSlidingViewController创建一个滑出菜单(如Facebook).

我有这个故事板:

故事板

如你所见,我有一个导航控制器.我有一个主要问题,即使是制作该控制器的用户创建的官方演示也没有实现:它在更改视图然后返回时不会保存视图控制器的状态.

因此,例如,当我打开应用程序时,橙色视图将始终是第一个视图viewDidLoad.然后我切换到绿色视图(第二个),然后单击按钮.它将该视图的背景颜色更改为红色.然后,如果我回到我的第一个视图,然后回到第二个视图,后者的背景颜色再次变为绿色.我希望它保持红色.

这是我切换视图的代码(in 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];

    }];
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它始终每次都实例化一个新的VC.我希望它保存VC,如果没有创建它,则创建新的,然后显示一个.如果用户返回到已创建的视图,则应该只恢复已保存的视图,而不是创建新视图.

我已经把它Init View Controller放在导航控制器中,现在我该如何为我的视图实现这种保存/恢复机制?我希望它与2,3,4等一起工作......尽可能多的观点.

谢谢.

bat*_*uip 5

当你"返回"时,你基本上从导航堆栈弹出viewcontroller.此时,没有更多对该视图控制器的引用,并且它被取消分配,因此您将丢失所有更改.

您可以通过以下几种方式处理:

1)在父视图控制器(正在呈现的视图控制器)中保持对红色/绿色视图控制器活动的引用,并使用它而不是实例化新视图控制器.这不是非常友好的,但如果谨慎使用则可以使用.

在界面中放:

@property (nonatomic, strong) UIViewController* myGreenController;
Run Code Online (Sandbox Code Playgroud)

然后将实例化更改为

if (!self.myGreenController)
{
   self.myGreenController = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
}
...
self.slidingViewController.topViewController = self.myGreenController;
Run Code Online (Sandbox Code Playgroud)

2)理想情况下实现委托模式以将状态传递回父视图控制器(类似于如何设置一个简单的委托以在两个视图控制器之间进行通信?).然后下次需要viewController时,在呈现之前设置状态.