どの iPhone アプリでも、次のシーケンス (VC=ViewController) を考慮してください。
- VC-A が表示されます ... ユーザーがボタンを押して VC-B をロードします
- VC-B が押されて表示されます...ユーザーはスライダーを 0 から 5 に移動します...次に、navBar の [戻る] を押します
- VC-B がポップされ、VC-A が表示されます...ユーザーはもう一度ボタンを押して VC-B をロードします
- 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 であるため、その状態を保持することはできません。