1

У меня есть приложение, которое не работает должным образом с восстановлением состояния. Раньше это делалось, но когда я начал отходить от раскадровки, он остановился.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 > чей вид не в иерархии окон!

Это что-то другое.

+0

У вас есть обходное решение для этого. У меня есть аналогичная проблема, у меня есть пользовательская вкладка, которая добавляет childviewcontrollers, который завернут в контроллер навигации, когда я печатаю путь, который он дает правильно, но не восстанавливает толкаемый контроллер, хотя он сохраняет до пользовательской вкладки, путем кодирования индекс и контроллер childview ... – Sabby

ответ

0

Вам необходимо назначить разные идентификаторы восстановления для разных объектов FolderViewController.

Например:

FolderViewController *folderViewController1 = // initialize object ; 
FolderViewController *folderViewController2 = // initialize object ; 

folderViewController1. restorationIdentifier = @"folderViewController1"; 
folderViewController2. restorationIdentifier = @"folderViewController2"; 

Я попытался выше код и он работал отлично.