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

0 ответов

Другие вопросы по тегам