ドキュメントは正しいですが、非常に不完全です。これが何が起こっているのかです。Webビューが状態の復元に参加している場合(これが何を意味するかを知っていると思います-すべてにrestorationIdentifier
、などが必要です)、およびユーザーがアプリを離れたときにWebビューにリクエスト(HTML文字列ではない)があった場合、Webビューは、プロパティと同じリクエストを含み、request
BackリストとForwardリストをそのままにして、自動的に元の状態に戻ります。したがって、状態復元メカニズムを使用してWebビューの状態を復元できますが、少し余分なダンスを実行する必要があります。このダンスは非常に好奇心が強く、あいまいなので、最初は、ドキュメントの主張にもかかわらず、Webビューの状態を実際に保存および復元することはできないという印象を受けました。
ここには2つの秘密があります。それらを知ったら、Webビューの状態の復元を理解できます。
これを知っていると、Webビューの状態を復元するための戦略を簡単に考案できます。最初に、状態を復元していることを検出し、そのことを示すフラグを立てます。
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
self->_didDecode = YES;
}
これで、状態を復元していること、およびWebビューに魔法のようにリクエストが含まれていることを(おそらくでviewDidAppear:
)検出し、そのリクエストをロードできます。
if (self->_didDecode && wv.request)
[wv loadRequest:wv.request];
トリッキーな部分です。ビューが読み込まれた後、すぐに「戻ります」。これには、実際には、ユーザーの以前のスクロール位置を復元する効果があります(そして、バックスタックの一番上から余分なエントリを削除する効果があります)。次に、フラグを下げて、他のときにこの余分な動きをしないようにします。
- (void)webViewDidFinishLoad:(UIWebView *)wv {
if (self->_didDecode && wv.canGoBack)
[wv goBack];
self->_didDecode = NO;
}
UIWebViewは、ユーザーが以前にアプリを離れたときの状態になりました。組み込みのiOS6状態保存および復元機能を使用して、状態を保存および復元しました。