У меня есть приложение, которое не работает должным образом с восстановлением состояния. Раньше это делалось, но когда я начал отходить от раскадровки, он остановился.UIViewControllers создаются, но не отображаются в состоянии восстановления
Мое приложение начинается с LoginViewController
, который является стартовым контроллером в моей раскадровке. Если логин успешно завершен, он пытается добавить два контроллера FolderViewController
в контроллер навигации. Это значит, что видимая папка уже на одном уровне. Это делается в следующем коде:
UINavigationController *foldersController = [[UINavigationController alloc] initWithNavigationBarClass:nil toolbarClass:nil];
foldersController.restorationIdentifier = @"FolderNavigationController";
FolderViewController *root = [storyboard instantiateViewControllerWithIdentifier:@"FolderView"];
root.folderId = 0;
FolderViewController *fvc = [storyboard instantiateViewControllerWithIdentifier:@"FolderView"];
fvc.folderId = 1;
[foldersController setViewControllers:@[root, fvc] animated:YES];
[self presentViewController:foldersController animated:YES completion:nil];
FolderViewController
имеет этот awakeFromNib
- (void)awakeFromNib
{
[super awakeFromNib];
self.restorationClass = [self class]; // If we don't have this, then viewControllerWithRestorationIdentifierPath won't be called.
}
в пределах раскадровки FolderViewController имеет restorationIdentifier
набор. Когда я нажимаю кнопку «Домой», приложение приостанавливается. Мои восстановительные вызовы в FolderViewController
будут называться:
// This is being called
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[super encodeRestorableStateWithCoder:coder];
[coder encodeInt64:self.folderId forKey:@"folderId"];
}
Проблема теперь, когда я пытаюсь восстановить. Я останавливаю приложение в своем отладчике, а затем запускаю его снова. Это начинает процесс восстановления.
Во-первых, мой viewControllerWithRestorationIdentifierPath:coder:
для моего LoginViewController
называется. Это не делает много, и его использование необязательно. Я попытался удалить его, и у меня нет никакого плохого эффекта.
+ (UIViewController*) viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
LoginViewController* vc;
UIStoryboard* sb = [coder decodeObjectForKey:UIStateRestorationViewControllerStoryboardKey];
if (sb)
{
vc = (LoginViewController *)[sb instantiateViewControllerWithIdentifier:@"LoginViewController"];
vc.restorationIdentifier = [identifierComponents lastObject];
vc.restorationClass = [LoginViewController class];
}
return vc;
}
Далее viewControllerWithRestorationIdentifierPath:coder:
для моего FolderViewController
называется:
// This is being called
+ (UIViewController*) viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
FolderViewController* vc;
UIStoryboard* sb = [coder decodeObjectForKey:UIStateRestorationViewControllerStoryboardKey];
if (sb)
{
vc = (FolderViewController *)[sb instantiateViewControllerWithIdentifier:@"FolderView"];
vc.restorationIdentifier = [identifierComponents lastObject];
vc.restorationClass = [FolderViewController class];
vc.folderId = [coder decodeInt32ForKey:@"folderId"];
}
return vc;
}
Я ранее имел decodeRestorableStateWithCoder:
, а также, и это дозвонились. Однако, поскольку он настроен в viewControllerWithRestorationIdentifierPath:coder:
, его не нужно было поддерживать.
Все эти вещи называются соответствующим количеством раз. Но, в конце концов, единственный контроллер просмотра, который отображается в LoginViewController
. Почему мои FolderViewController
s не отображаются. Есть ли недостающая настройка, которую мне нужно сделать в моем LoginViewController
, чтобы прикрепить контроллеры представлений, которые я добавил вручную ранее?
Редактировать
После прочтения http://aplus.rs/2013/state-restoration-for-modal-view-controllers/, который, казалось уместным, я добавил следующий код делегата приложения:
- (UIViewController *)application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
if ([identifierComponents.lastObject isEqualToString:@"FolderNavigationController"])
{
UINavigationController *nc = [[UINavigationController alloc] init];
nc.restorationIdentifier = @"FolderNavigationController";
return nc;
}
else
return nil;
}
Я думаю, что App счастливее сейчас, но она до сих пор не восстановить должным образом. Теперь я получаю эту ошибку в моем журнале:
Предупреждение: Попытка представить < UINavigationController: 0xbaacf50 > на < LoginViewController: 0xbaa1260 > чей вид не в иерархии окон!
Это что-то другое.
У вас есть обходное решение для этого. У меня есть аналогичная проблема, у меня есть пользовательская вкладка, которая добавляет childviewcontrollers, который завернут в контроллер навигации, когда я печатаю путь, который он дает правильно, но не восстанавливает толкаемый контроллер, хотя он сохраняет до пользовательской вкладки, путем кодирования индекс и контроллер childview ... – Sabby