0

どの iPhone アプリでも、次のシーケンス (VC=ViewController) を考慮してください。

  1. VC-A が表示されます ... ユーザーがボタンを押して VC-B をロードします
  2. VC-B が押されて表示されます...ユーザーはスライダーを 0 から 5 に移動します...次に、navBar の [戻る] を押します
  3. VC-B がポップされ、VC-A が表示されます...ユーザーはもう一度ボタンを押して VC-B をロードします
  4. VC-Bを押して表示…でもスライダーが0に戻る

これは、上記のステップ 2 の VC-B インスタンスがステップ 4 の VC-B インスタンスと異なるために発生しているため、状態が失われます。これを回避するには、VC-B をシングルトンにするか、VC-B への強い参照をどこかに保持して、新しいインスタンスを作成する代わりにそれを再利用します。

コード内で VC のインスタンスを手動で作成するので、nib から VC をロードするとき、このロジックはうまく機能していました。ストーリーボードでは、インスタンスを自動的に作成するのはセグエであるため、これは機能しません。代わりに自分の VC を確実に再利用するにはどうすればよいですか?

シングルトンを維持するために、次のトリックを試しました。


- (id) initWithCoder:(NSCoder *)aDecoder{
    if(instance==nil){
        NSLog(@"LMHomeViewController init called");
        instance = [super initWithCoder:aDecoder];
        super.screenType = [NSNumber numberWithInt:home_screen];
    }
    return instance;
}

しかし、実行時エラーが発生しました:

Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder:'

ここに何か提案はありますか?私の関心は、ユーザーがナビゲーション ツリーを行ったり来たりするときに VC の状態を維持することです。

注: 私の場合の状態は UIWebView であるため、その状態を保持することはできません。

4

1 に答える 1

0

NSUserDefaultsこれは、 on で状態を読み取り、 onviewWillAppearで書き出すviewWillDisappear(およびその他の適切な場所で)を使用するケースである可能性があります。

いずれにせよ、MVC はビュー階層ではなくモデルに保持する方が適切です。したがって、NSUserDefaults でない場合は、状態データのみを格納する必要があるシングルトンを検討してください。

別のアイデア。viewController オブジェクトを保持したい場合は、ストーリーボード セグエを使用しないでください。プロパティに強い参照を保持して使用する

  [self.navigationController pushViewController:self.persistingViewController];

アクセサーは、persistingViewController最初のラウンドで viewController を遅延インスタンス化できます。参照を保持している限り、再利用できます。

  - (UIViewController*) persistingViewController
  {
     if (!_persistingViewController) {
       UIStoryboard *story = [UIStoryboard storyboardWithName:@"MainStoryBoard" bundle:nil];
     _persistingViewController = [story instantiateViewControllerWithIdentifier:@"myViewController"];

   }

   return self.persistingViewController

}

于 2013-02-04T17:59:33.233 に答える