5

iPhoneでのアプリケーションの状態の復元について別の質問があります。単純なデータ(選択したタブなど)はNSUserDefaultsに保存できますが、それだけでは不十分です。

ナビゲーションコントローラーを含む状態全体を復元したい(サブサブサブビューコントローラーに移動)。

私の問題は、アプリケーションがいくつかのxibファイルに分割されているため、最初はすべてのViewControllerがインスタンス化されていないことです。xibファイルからインスタンス化を「強制」する方法はありますか?

(私は手元にコードを持っていませんが、それが明確でない場合は小さな終わりを書くことを試みることができます)

どうもありがとう。

4

3 に答える 3

5

呼び出し[viewController view]により、特定のビュー コントローラーの XIB が読み込まれていることが確認されます。それができたら、他のプロパティを通常どおり使用できます。

これが私がする傾向があることです:

@class Record;  // some model object--I assume it has an integer record ID
@class DetailViewController;

@interface RootViewController : UIViewController {
    IBOutlet DetailViewController * detailController;
}

- (void)restore;
...
@end

@implementation RootViewController

// Note: all detailController showings--even ones from within 
// RootViewController--should go through this method.
- (void)showRecord:(Record*)record animated:(BOOL)animated {
    [self view];    // ensures detailController is loaded

    [[NSUserDefaults standardUserDefaults] setInteger:record.recordID 
                                               forKey:@"record"];
    detailController.record = record;

    [self.navigationController pushViewController:detailController 
                                         animated:animated];
}

- (void)restore {
    int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"];

    if(recordID) {
        Record * record = [Record recordWithID:recordID];
        [rootViewController showRecord:record animated:NO];
        // If DetailViewController has its own state to restore, add this here:
        // [detailController restore];
    }
}
...
- (void)viewDidAppear:(BOOL)animated {
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"];
}
@end

@implementation MyAppDelegate

- (void)applicationDidFinishLaunching:(UIApplication*)application {
    ...
    [rootViewController restore];
    ...
}
...
@end

ビュー階層の各レベルは、独自の状態保存を処理するため、アプリ コントローラーは、考えられるすべてのビューとそれらがどの順序にある​​かを知る必要はありません。

于 2009-04-07T10:11:10.043 に答える
4

私は自分のアプリ Litho Graph でこれを行います。終了時にページにいた場合は、次に起動したときにそのページに戻ります。これも非常に簡単です。私のメイン ビュー コントローラーの -viewDidLoad 実装では、ユーザーの既定値で最後に表示されたページのキーを確認します。何もない場合は、通常どおり続行します (すべてのページのリストを表示します)。何かあれば、そのページを開きます (新しいビュー コントローラーをナビゲーション コントローラー スタックにプッシュします)。

ビュー コントローラーの実際の読み込みは非常に簡単です。インスタンス化するだけです。私のビュー コントローラ クラスはそれぞれ -init をオーバーライドして -initWithNibName:bundle: を呼び出すようになっているため、+alloc と -init を呼び出してビュー コントローラ インスタンスを作成するだけで、適切な .xib ファイルからロードすることができます。次に、上記のように、ナビゲーション コントローラーのスタックにプッシュします。

[self.navigationController pushViewController: controller animated: YES];

もちろん、これは必要な数のレイヤーで行うことができますが、複数のトランジションが発生する場合は、アニメーションなしでビュー コントローラーをプッシュすることをお勧めします。ユーザーがいくつかのアニメーションを待たなければならないのは逆効果です (:

于 2009-04-07T09:59:40.960 に答える
0

りんごの「drilldownsave」サンプル コードを見てください。まさにあなたが望むことをします

于 2011-11-17T23:17:06.823 に答える