2009-04-07 10 views
5

iPhoneでのアプリケーションの状態の復元に関するもう1つの質問があります。 単純なデータ(選択したタブのような)はNSUserDefaultsに格納できますが、それだけでは不十分です。iPhoneアプリケーションの状態に関する別の質問

ナビゲーションコントローラを含む状態全体を復元したい(サブサブサブコントローラを表示する)。

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

(私は手の下では、コードを持っていないが、私はそれが明確でない場合には小端を書いてみることができます)

どうもありがとうございました。

答えて

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 

ビュー階層の各レベルには、独自の状態保存の世話をするので、アプリのコントローラがどの受注、彼らは可能性についてのすべての可能なビューとを知っている必要はありません。入る。

+0

これは完璧な解決策であるようですが、できるだけ早くテストします。ありがとう! –

+0

起動時にすべてのコントローラをロードすると、遅れてロードされ、アプリケーションの起動時間とメモリ使用量が増えます。 – Kornel

+0

スーパーコントローラにレコードIDがないかぎり、サブコントローラがロードされないため、すべてのコントローラがロードされません。 –

4

私はこのアプリ、Lithoグラフでこれを行います。終了時にページを開いている場合、次回起動時にはそのページに戻ります。私のメインビューコントローラの-viewDidLoad実装では、ユーザのデフォルトで表示された最後のページキーを確認します。何もない場合は、通常どおり(すべてのページのリストを表示して)続行します。何かがある場合は、そのページを開きます(新しいView Controllerをナビゲーションコントローラスタックにプッシュする)。

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

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

あなたがする必要があるとして、あなたはもちろん、深いこのよう多くの層を行うことができますが、ビューをプッシュすることが念頭に置いてクマいくつかのトランジションがある場合はアニメーションのないコントローラ、ユーザーは、いくつかのアニメーションを通じて待つ必要がすることは、(逆効果のようになります。

0

りんごの "drilldownsave"サンプルコードを見てください。あなたが望むものを正確に行います

関連する問題