Самый верхний дочерний View Controller не вызывает viewControllerWithRestorationIdentifierPath:coder: для состояния восстановления
Я выполняю восстановление состояния в моем приложении. Корневым контроллером представления является 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 все используют раскадровки, но представления Detail и Profile используют перья и что может возникнуть проблема, когда при использовании более одного контроллера представления с пером в стеке навигации который использует раскадровки не восстановится должным образом. Любая помощь будет принята с благодарностью:)