2

ストーリーボードを使用しない iOS 6 アプリで状態の保存と復元を実装したいと考えています。状態を保存して復元したいメインのView Controllerは、UINavigationControllerの一部であるUIViewControllerです。

私のView ControllerはUIViewControllerRestorationプロトコルを拡張しています。必要なメソッドをすべて実装していると思いますが、シミュレーターからの encodeRestorableStateWithCoder または decodeRestorableStateWithCoder への呼び出しは見られません。

アプリのデリゲートは次のようになります。

- (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder {
    NSLog(@"shouldSaveApplicationState"); // seeing this in the debug window
    return YES;
}

- (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder {
    NSLog(@"shouldRestoreApplicationState"); // seeing this in the debug window
    return YES;
}

- (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder {
    NSLog(@"willEncodeRestorableStateWithCoder"); // seeing this in the debug window
}

- (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder {
    NSLog(@"didDecodeRestorableStateWithCoder"); // seeing this in the debug window
}

これらの呼び出しはすべてデバッグ ウィンドウに表示されます。アプリの中断時に表示される MyMainViewController は次のようになります。

@interface MyMainViewController : UIViewController <UIViewControllerRestoration>
@end

@implementation MyMainViewController

- (id)init {
    if (self = [super init]) {
        self.restorationIdentifier = @"MyViewControllerRestoreId";
        self.restorationClass = [self class];
    }
    return self;
}

- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:frame];

    // Bunch of work to create my custom views
}

- (void)awakeFromNib {
    self.restorationClass = [self class];
}

// Expected a call to this method, but not seeing it in debug window
+ (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents
                                                            coder:(NSCoder *)coder {
    NSLog(@"viewControllerWithRestorationIdentifierPath: %@", identifierComponents);

    MyMainViewController *vc = [[MyMainViewController alloc] init];
    vc.restorationIdentifier = [identifierComponents lastObject];
    vc.restorationClass = [MyMainViewController class];

    return vc;
}

// Expected a call to this method, but not seeing it in debug window    
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    NSLog(@"encodeRestorableStateWithCoder");
    [super encodeRestorableStateWithCoder:coder];
}

// Expected a call to this method, but not seeing it in debug window    
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    NSLog(@"decodeRestorableStateWithCoder");
    [super decodeRestorableStateWithCoder:coder];
}    
@end

シミュレーターを使用して保存と復元をテストする方法:

1. Launch app in Simulator via Xcode
2. Invoke the Home key so App is now suspended. This where I see:
    shouldSaveApplicationState  
    willEncodeRestorableStateWithCoder
3. End the debugging session in XCode (Command .)
4. Start a new debug session of the app in XCode. I see:
    shouldRestoreApplicationState
    didDecodeRestorableStateWithCoder

この作業を行うために他に何が欠けているのかわかりません。

4

3 に答える 3

3

私はまったく同じ問題を抱えていました。結局のところ、restoreClass を使用するには、View Controller でプロトコルを明示的に設定する必要がありました。

<UIViewControllerRestoration>

あなたはすでに完了しているようですが、それは私のためにそれをやった.

于 2013-08-26T02:40:18.760 に答える
1

私は自分自身で状態の保存/復元を学んでいるので、これが役立つかどうかはわかりませんが、私が取り組んでいるチュートリアルから得たものを試してみてください.

VC が TabBar または NavController にある場合は、restoreIdentifier も持っていることを確認してください。

于 2013-06-07T22:24:42.923 に答える