目標:タブ コントローラー ベースのアプリ (各タブにナビゲーション コントローラーを使用) で状態を復元しようとしています。
問題:再起動すると、選択したタブは期待どおりに復元されているように見えますが、そのタブ内のナビゲーション階層は復元されていません。
発達:
- 最初はプロジェクト テンプレート「タブ ベースのアプリ」から始めました。
- 次に、子ビュー コントローラーとタブ バー コントローラーの両方に復元 ID を追加しました。
- アプリ デリゲートでは、 と を実装
application(_:shouldSaveApplicationState:)
しapplication(_:shouldRestoreApplicationState:)
ました。
次にアプリを実行し、2 番目 (右) のタブに切り替え、ホームをクリックして終了します。o 再起動すると、右側のタブが表示されます (期待どおり)。ここまでは順調ですね。
- 次に、ストーリーボードに移動し、両方の子ビュー コントローラーをそれぞれのナビゲーション コントローラーに埋め込み、それらにも復元 ID を割り当てます。
アプリを実行しましたが、復元は引き続き機能します。まだいい。
次に、「詳細」View Controller を追加します。そのクラスは
UIViewController
、ストーリーボードのカスタム サブクラスであり、デバッグ ラベルの内容とそのビューの背景色を構成するプロパティがあります。各タブのトップビューコントローラーに「詳細を表示...」ボタンを配置し、それぞれから(共有)詳細ビューコントローラーへのセグエを作成しました。これで、ストーリーボードは六角形のように見えます (また、どちらのセグエにも Interface Builder で識別子が設定されています)。そのため、左右の両方のトップ ビュー コントローラーが同じタイプの「詳細」ビュー コントローラーを共有します。ショーでは、プッシュされた場所と区別できるように構成されています (次のポイントを参照)。
トップ ビュー コントローラーの
prepareForSegue(_:sender:)
メソッドごとに、プッシュされた詳細ビュー コントローラーを異なる方法で構成します。異なるテキストと背景色 (それぞれ「左」と青、「右」と赤)。詳細ビュー コントローラーにコードを追加して、テキストと背景色のプロパティの状態を保存および復元しまし
encodeRestorableStateWithCoder(_:)
たdecodeRestorableStateWithCoder(_:)
。viewDidLoad()
また、それらのプロパティの値をビューに反映するように実装しました。インスタンス化され、セグエを介してナビゲーションにプッシュされるたびに、プロパティが最初に設定され、次に でビューを構成するために使用されviewDidLoad()
ます。復元中にインスタンス化されるたびに、プロパティが設定されdecodeRestorableStateWithCoder(_:)
、 で同様に使用されviewDidLoad()
ます。
...しかし、このコードを実行すると、最後に選択したタブが復元されますが、詳細ではなく、上部のビュー コントローラー(左または右)までのみです。興味深いことに、最後に詳細ビュー コントローラーに設定された背景色が一瞬点滅します。
encodeRestorableStateWithCoder(_:)
とにブレークポイントを配置しdecodeRestorableStateWithCoder(_:)
ましたが、実行されるのは最初の 1 つだけです ( encode )。
- 何が欠けているのか疑問に思ったので、先に進んでアプリ デリゲートを実装しました
application(_:viewControllerWithRestorationIdentifierPath:coder:)
(常に nil を返しますが、渡されたパス コンポーネントをログに記録します)。
このメソッドが必要かどうかについてのドキュメントはあまり明確ではありません。いずれにせよ、詳細を除くすべてのView Controllerは、それがなくても完全に復元されるようです。最後のパス コンポーネント (つまり、そのコントローラーの復元 ID) に基づいて各ビュー コントローラーをインスタンス化し、それを返すコードを追加しました。
これでdecodeRestorableStateWithCoder(_:)
が呼び出されますが、ナビゲーションはまだタブのトップ ビュー コントローラーに戻ります。
それで、何が起こっているのですか?タブ バー + ナビゲーション コントローラー アプリで状態の保存と復元を実装するには何が欠けていますか?