1

상태 복원에서 제대로 작동하지 않는 앱이 있습니다. 그것은 이전에했지만, 스토리 보드에서 벗어나기 시작하면서 멈췄습니다.상태 복원에서 UIViewController가 생성되었지만 표시되지 않았습니다.

내 앱은 내 스토리 보드의 시작보기 컨트롤러 인 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는 FolderViewController가 restorationIdentifier 세트가 스토리 보드 내에서이 awakeFromNib

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    self.restorationClass = [self class]; // If we don't have this, then viewControllerWithRestorationIdentifierPath won't be called. 
} 

있습니다. 홈 버튼을 누르면 앱이 일시 중지됩니다. FolderViewController에서 내 복원 통화가 호출되고 : 나는 시도하고 복원 할 때

// This is being called 
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super encodeRestorableStateWithCoder:coder]; 
    [coder encodeInt64:self.folderId forKey:@"folderId"]; 
} 

지금 문제입니다. 내 디버거에서 응용 프로그램을 중지하고 다시 시작합니다. 이것은 복원 과정을 시작합니다.

먼저 내 LoginViewController에 대한 내 viewControllerWithRestorationIdentifierPath:coder:이 호출됩니다. 이것은별로 효과가 없으며 선택 사항입니다. 나는 그것을 제거하려고 노력했지만 어떤 나쁜 영향도 끼치 지 않는다.

// 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: 했어, 그것은 전화를받을 않았다

+ (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; 
} 

다음으로, 내 FolderViewController에 대한 viewControllerWithRestorationIdentifierPath:coder:가 호출됩니다. 그러나 viewControllerWithRestorationIdentifierPath:coder:에 설치되었으므로 주변에 두지 않아도됩니다.

이 모든 것들이 적절한 횟수만큼 호출되고 있습니다. 그러나 결국에는 LoginViewController에 표시되는 유일한보기 컨트롤러입니다. 내 FolderViewController이 표시되지 않는 이유는 무엇입니까? 이전에 수동으로 추가 한보기 컨트롤러를 연결하려면 LoginViewController에서 수행해야 할 설정이 누락 되었습니까? 나는 앱은 지금 행복하다 생각하지만, 아직 복원되지

- (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; 
} 

:

편집

관련 보였다 http://aplus.rs/2013/state-restoration-for-modal-view-controllers/을 읽은 후, 나는 앱 위임에 다음 코드를 추가 정확히. 지금 나는 내 로그에이 오류를 얻을 :

경고 : 시도가 <은 UINavigationController를 제시 : 0xbaacf50 > < LoginViewController에 : 그보기 창 계층 구조에없는 0xbaa1260 >을!

다른 의미입니다.

+0

해결 방법이 있습니까? 비슷한 문제가 생겼어. 네비게이션 컨트롤러에 포장 된 childviewcontrollers를 추가하는 커스텀 탭이있다. 패스를 출력하면 올바르게 표시되지만, 푸시 된 컨트롤러로 복원되지 않는다. 색인 및 childviewcontroller ... – Sabby

답변

0

다른 복원 식별자를 다른 FolderViewController 개체에 할당해야합니다.예를 들어

:

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

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

나는 위의 코드를 시도하고 괜찮 았는데.