恢复并保留从UINavigationController推送的UIViewController,没有故事板

时间:2014-08-20 10:02:11

标签: ios objective-c xcode state-restoration uikit-state-preservation

我尝试恢复从初始视图控制器推送的简单UIViewController。第一个被保留,但第二个刚刚重新启动时消失。我不使用故事板。我在每个视图控制器中实现协议,并将restorationIdentifier和restorationClass添加到每个视图控制器中。

第二个viewController继承自第三个viewController,并从xib文件初始化。我不确定是否需要将UIViewControllerRestoration实现到第三个,因为我不直接使用它。

我的代码看起来像这样:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.restorationIdentifier = @"EditNotificationViewController";
        self.restorationClass = [self class];
    }
    return self;
}

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{

}
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{

}

+(UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
    EditNotificationViewController* envc = [[EditNotificationViewController alloc] initWithNibName:@"SearchFormViewController" bundle:nil];
    return envc;
}

是否应该将navigationController设为子类,以便它也可以从UIViewControllerRestoration继承?

更新: 好吧,似乎从UIViewController推送到UIViewController工作。但是从UIViewController推送到UITableViewController,反之亦然,不行。如果tableview实现UIViewControllerRestoration协议,应用程序崩溃。如果我没有实现协议,则不会保留从tableView推送的UIViewControllers。

如何处理UITableViewControllers以保护它们而不会崩溃?

更新: 没有崩溃..这是由于我的应用程序特定的内存错误。但是tableView仍然没有被保留,也没有被推送的viewController。

更新: 我的tableview没有正确恢复的原因是因为我在后台删除了我的数据源..但是当我尝试将其推送到另一个navigationController而不是self.navigationController时,我仍然遇到模态viewController没有出现的问题。我将恢复标识符设置为此模态navigationController,但视图未显示。

1 个答案:

答案 0 :(得分:1)

模态转换需要由UINavigationController支持,该控件具有restoreIdentifier和应用委托方法viewControllerWithRestorationIdentifierPath中的恢复类或相应的实现。这解决了最后一个问题。