2013-12-18 1 views
6

UIViewControllerおよび関連クラスに状態の復元を追加しました。これにより、アプリケーションは終了時に状態を保存し、ユーザーがアプリケーションを再開したときに復元することができます。のUIViewController州立修復 - iOSの6 Appleと弱い関係

すべてがしかし、私はパターンに合うように望んでいない奇妙なシナリオに達している、正常に動作するようです。

ViewControllerOneViewControllerTwoの2つのビューコントローラがあり、どちらも正常に復元された任意の状態が格納されているとします。今度はViewControllerOnedelegateというプロパティがあり、ViewControllerTwoがデリゲート(モーダルビューコントローラの共通パターン)であるとしましょう。この関係を回復する責任は誰にありますか?そして、それはどのようにして保存/復元されるはずですか?何の絵コンテが関与していないしている私の特定のケースで

、復元がrestorationClassプロパティを使用して、コード内で起こります。私の最初の本能は、修復クラス内にView Controllerを作成しながら関係を復元しようとしていましたが、restorationClassには他の既存のコントローラがないため、このような関係を復元できません。

また、delegateプロパティを宣言するビューコントローラであれば、リレーションシップを復元するはずです。次に、他のクラスに復元されたコントローラインスタンスはどうなりますか?要するに

、これは悪い文書化されたシナリオのように思えるし、私は誰かがそれにいくつかの光を当てることができ期待していました。

答えて

2

私は、タスクが他のビューコントローラをプッシュする前に、あなたがそれを行うと同じように、のような自分自身を設定するには、デリゲートのビューコントローラに落ちる、と言うでしょう。

これを達成する方法には、いくつかの選択肢があります。

グローバルにアクセス可能な場所(たとえば、アプリケーションデリゲート)にビューコントローラの弱い参照を格納し、application:didDecodeRestorableStateWithCoder:にこれらの値を使用して委任を設定することができます。この方法はAPIでの方法です。

また、デリゲートがリッスンして自身をデリゲートとして設定するトップビューコントローラから「hereIAmThisIsMe」通知(ユーザー情報の一部にself)を投稿することもできます。

+0

これは確かに事態を起こすもっともらしい方法ですが、それが最もエレガントではないということに同意しないでしょうか?つまり、最初に提案されたソリューションがカプセル化を少し破るように感じます(AppDelegateはこれを「すべて知っています」ということになります)。 2番目の方法はもう少し興味深いアプローチですが、decodeRestorableStateWithCoder:でこの通知をどこに送りますか? –

+0

オプションがありますが、どのコントローラが最初に復元されるのかについて心配する必要があります。 –

+1

@HenriNormakところで、最初の方法は必ずしもカプセル化を中断しません。プロトコルを実装し、 'PostRestorationHandler'と呼びましょう。ここにはメソッド' didFinishRestoration'があり、デリゲートビューコントローラにデリゲートを設定させることができます。 AppDelegateは、ビューコントローラ(およびそれらのアプリケーションデリゲートについて)が存在していることを知っていますが、内部には触れません。 –

関連する問題