最顶层的Child View Controller没有调用viewControllerWithRestorationIdentifierPath:coder:用于恢复状态

时间:2015-03-18 18:21:01

标签: ios uinavigationcontroller storyboard nib state-restoration

我正在我的应用中实施状态恢复。根视图控制器是UITabBarController。在每个选项卡中,我都有一个带子视图控制器的UINavigationController。状态恢复似乎在UITabBarController中正常工作。问题出在其中一个选项卡中,UINavigationController的最顶层子视图控制器不会调用恢复方法: + viewControllerWithRestorationIdentifierPath:coder:

导航控制器根视图始终是UITableViewController。根据选择的单元格,您可以推送到DetailViewController或ProfileViewController。在我的App Delegate和我的故事板中正确设置了所有内容,这两个恢复路径都恢复正常:

TabBarController - >的 NavigationController - >的 TableViewController - >的 DetailViewController

TabBarController - >的 NavigationController - >的 TableViewController - >的 ProfileViewController

但是,您还可以从DetailViewController推送到ProfileViewController,反之亦然,但这是恢复失败的地方。最顶层的视图控制器无法恢复:

TabBarController - >的 NavigationController - >的 TableViewController - >的 DetailViewController - > ProfileViewController (失败)

TabBarController - >的 NavigationController - >的 TableViewController - >的 ProfileViewController - > DetailViewController (失败)

设置断点时,似乎在最顶层的视图控制器上没有调用+ viewControllerWithRestorationIdentifierPath:coder:。如果它是在表控制器顶部推送的第一个视图,则被调用,但在任何后续视图中都不会被调用,无论是详细信息到配置文件还是配置文件到详细信息。

ProfileViewController的实现

@interface ProfileViewController () <UIViewControllerRestoration>

@end

@implementation ProfileViewController

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

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    [super encodeRestorableStateWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.restorationClass = [self class];
        self.restorationIdentifier = [[NSUUID UUID] UUIDString];
    }
    return self;
}

和DetailViewController非常简单:

@interface DetailViewController () <UIViewControllerRestoration>

@end

@implementation DetailViewController

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

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    [super encodeRestorableStateWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.restorationClass = [self class];
        self.restorationIdentifier = [[NSUUID UUID] UUIDString];
    }
    return self;
}

我唯一可能想到的是UITabBarController,UINavigationControllers和UITableViewController都使用Storyboard,但Detail和Profile视图使用nibs,并且可能存在使用带有nib的多个视图控制器的问题使用故事板的导航堆栈无法正常还原。任何帮助将不胜感激:)

0 个答案:

没有答案