2013-04-26 88 views
1

我使用ECSlidingViewController来创建滑出菜单(如Facebook)。如何在iOS中保存/恢复视图状态?

我有这样的故事板:

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等一起工作......尽可能多的观点。

谢谢。

回答

5

当你走回去时,你基本上会从导航栏中弹出视图控制器。在那时,没有更多的引用该视图控制器,它被取消分配,结果你松散所有的更改。

您可以处理这几种方法:

1)保持对它的引用红色/绿色的ViewController在父视图控制器(即呈现一个),并使用在人世,而不是实例化一个新的。这不是非常有利于记忆的功能,但如果谨慎使用则可以使用。

在界面上放:

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