2

最初のView Controllerからプッシュした単純なUIViewControllerを復元しようとしています。最初のものは保持されますが、2 番目のものは再起動すると消えます。ストーリーボードは使いません。すべてのView Controllerにプロトコルを実装し、それぞれにrestoreIdentifierとrestoreClassを追加します。

2 番目の viewController は 3 番目の viewController から継承し、xib ファイルから初期化されます。UIViewControllerRestoration を直接使用しないため、この 3 番目に実装する必要があるかどうかはわかりません。

私のコードは通常次のようになります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.restorationIdentifier = @"EditNotificationViewController";
        self.restorationClass = [self class];
    }
    return self;
}

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{

}
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{

}

+(UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
    EditNotificationViewController* envc = [[EditNotificationViewController alloc] initWithNibName:@"SearchFormViewController" bundle:nil];
    return envc;
}

おそらく、navigationController もサブクラス化して、UIViewControllerRestoration から継承できるようにする必要がありますか?

更新: OK、UIViewController から UIViewController へのプッシュが機能するようです。しかし、UIViewController から UITableViewController へのプッシュ、およびその逆のプッシュは機能しません。テーブルビューが UIViewControllerRestoration プロトコルを実装している場合、アプリがクラッシュします。プロトコルを実装しないと、tableView からプッシュされた UIViewControllers は保持されません。

UITableViewControllers をクラッシュさせずに保持するには、どのように扱うべきですか?

更新: もうクラッシュしません..これは、アプリ固有のメモリ バグが原因でした。しかし、tableView はまだ保持されておらず、プッシュされた viewController も保持されていません。

更新:テーブルビューが正しく復元されなかった理由は、バックグラウンドでデータソースを削除したためです..しかし、モーダルviewControllerをself.navigationController以外の別のnavigationControllerにプッシュしようとすると、モーダルviewControllerが表示されないという問題がまだあります。このモーダル ナビゲーション コントローラーに復元識別子を設定しましたが、ビューが表示されません。

4

1 に答える 1

1

モーダル トランジションは、restoreIdentifier を持つ UINavigationController と、アプリ デリゲート メソッド viewControllerWithRestorationIdentifierPath 内の復元クラスまたは対応する実装のいずれかによってサポートされる必要があります。これにより、問題の最後の部分が解決されました。

于 2014-08-21T10:06:03.357 に答える