2

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

第二个 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;
}

导航控制器是否应该被子类化,以便它也可以从 UIViewControllerRestoration 继承?

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

应该如何对待 UITableViewControllers 以保护它们而不会崩溃?

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

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

4

1 回答 1

1

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

于 2014-08-21T10:06:03.357 回答