Hatena::Groupiphone-dev

iOS プログラミングメモ

2013-04-27 (Sat)

[] StateRestore 21:41  StateRestore - iOS プログラミングメモ を含むブックマーク

iOS4 からアプリを終了してもしばらくの間は状態がそのままで次に起動した時は終了時の状態が復元するけど、メモリが少なくなった時とかは必ずしも復元するわけじゃないから、そんな場合にも手軽に状態を復元できるようにするための便利機能が iOS6 で搭載されたというわけで、そのサンプルが StateRestore でした。

Storyboard 上でそれぞれの ViewController に Storyboard ID と Restration ID を指定しておいてから、AppDelegate と ViewController 上で状態の保存・復元用のコードを書くだけでいいと。Info.plist で Application does not run in background (UIApplicationExitsOnSuspend) を YES にすると動きがわかりやすくていいかも。modal を開いてテキストを適当に入力した状態でアプリを終了しても、完璧に復元する。

テーブルの状態管理が少しややこしそうかなあ。モデルの識別子を保存して、復元させる時はその識別子を使って indexPath を得るということをしてるようだ。

- (NSString *) modelIdentifierForElementAtIndexPath:(NSIndexPath *)idx inView:(UIView *)view
- (NSIndexPath *) indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view

Prefix.pch に書いてある MANUALLY_CREATE_VC_FOR_RESTORATION ていうマクロを有効にすると、状態復元時の ViewController の生成処理のサンプルコード(下に書いた長ったらしい名前のメソッドの実行サンプル)が有効になるみたい。

+ (UIViewController *) viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents  coder:(NSCoder *)coder

この viewControllerWithRestorationIdentifierPath は必ずしも使う必要はないわけだけど、たとえばロード済みの Controller を返したりとかそういう感じで使うっぽいとかドキュメントに書いてあるっぽいんだけどよくわからん。

DataSource クラスと Item クラスが超シンプルなデータモデルになってて NSKeyedArchiver で永続化しているので、この辺やったことない人は参考になるかも。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130427