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

时间:2013-04-26 23:03:36

标签: ios objective-c uiviewcontroller uinavigationcontroller

我正在使用ECSlidingViewController创建一个幻灯片菜单(如Facebook)。

我有这个故事板:

Storyboard

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

因此,例如,当我打开应用程序时,橙色视图将始终是第一个视图,它将获得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等一起工作......尽可能多的观点。

感谢。

1 个答案:

答案 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时,你可以在呈现之前设置状态。