我正在我的应用中实施状态恢复。根视图控制器是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的多个视图控制器的问题使用故事板的导航堆栈无法正常还原。任何帮助将不胜感激:)