2013-08-04 4 views
5

私はカスタムコンテナビューコントローラを持っています:ContainerVC。その仕事は、現在の方向に応じて、2つのコンテンツビューコントローラ(ContentPortraitVCまたはContentLandscapeVC)のうちの1つを表示することです(コンテナがそのビューを選択する理由は関係ありませんが、私は推測します)。 ContentPortraitVC、ある時点で、ContentModalDetailVCがポップアップします。モーダルビューコントローラと子ビューコントローラはどのように相互作用しますか?

  • 親子関係(addChildViewController経由扇動とremoveFromParentViewControllerを介して除去)、

  • presenting-:

    だからここに仕事で新しいコンテンツを表示する2つの異なる方法があります提示された関係(presentViewControllerによって誘発され、dismissViewControllerを介して取り除かれた)。

ContainerVCは、ContentModalDetailVCを提示し、その後、ContainerVCContentLandscapeVCに切り替えることを決定ContentPortraitVCContentModalDetailVCは(その親が削除されたときに、なぜそれが削除されていない?)目に見えるままを追加した場合

しかし、ContentPortraitVCContentModalDetailVCを削除するように要求されても何も起こりません。モーダル表示はそのままです。何が起こっている?

答えて

4
  1. あなたがContentPortraitVCを追加するaddChildViewControllerを使用します。

    ContentPortraitVCは、parentViewControllerプロパティセットを取得します。

    b。そうすれば(Appleのドキュメントに従って)、ContentPortraitVCのビューを手動で表示する必要があります。あなたがドキュメントに従っている場合は、ControllerVCの最上位ビューを追加することでこれを行います。

  2. ContentPortraitVCは、ContentModalDetailVCと表示するためにpresentViewControllerを呼び出します。

    a。これは、presentingViewControllerプロパティを設定します(デバッガではこれは_parentModalViewController ivarと表示されます - ivarはプロパティと異なります)。ContentPortraitVCpresentedModalViewControllerプロパティ(who's ivarは_childModalViewcontroller)を設定します。

    b。 iPhoneで、ContentModalDetailVCのビューはContentPortraitVCContainerVCのビューを完全に置き換えるので、モーダルビューコントローラのビューのみが表示されます。 (iPad上では新しいUIが上に重ねられますが、の兄弟ControllerVCのビューはContentPortraitVCのビューの親です)。

  3. これで、ContentPortraitVCからContentLandscapeVCに移行しました。

    a。 IOSは魔法のビットを行います。削除しているもの(ContentPortraitVC)には現在presentedViewControllerがあるので、その親は変更されています。値をContentPortraitVCnilに設定し、子(ContentModalDetailVC)を取り込み、その親を新しいビュー(ContentLandscapeVC)に設定します。したがって、モーダル表示を提示したビューコントローラは、もはやその表示コントローラではありません。それはあたかもContentLandscapeVCがそれを提示したかのようです!

    b。ビューの観点から見ると、アップルのドキュメントに従い、ビューをContentPortraitVCからContentLandscapeVCに変更しています。しかし、単にControllerVCのビューのサブビューを変更しています。 iPhoneでは、モーダルビューコントローラはまだ表示されている唯一のものなので、変更を加えることは画面上で何もしません。 iPadでは、(モーダル表示は通常はフルスクリーンなので、おそらく表示されませんが)表示されます。

  4. これでモーダルビューが表示されなくなりました。恐らくContentPortraitVCでこれを行いますが、提示したものへの参照はなくなりました。したがって、ContentPortraitVCは何も提示しないので、[self dismissViewController...を呼び出すことは何もしません。その責任はContentLandscapeVCに渡されました。

これは、その理由とその理由です。それについて何をすべきかここにあります。

  1. あなたはContentPortraitVCからContentLandscapeVCに変更した場合は、手動で、デリゲートを再配線することができますので、後者はモーダルコントローラを解任しようとするものです。

  2. モーダルコントローラーを[self dismissModalControllerAnimated:YES completion:nil]で消滅させることができます。私はそれがなぜ機能するのか(IOSはどのように却下すべきかを知っていますか?

  3. ControllerVCは、モーダルビューをポップアップして削除する責任を負うことができます。

+0

私はこの問題に遭遇し、この回答から何が起こっているのか理解しました。切り替え時にコンテナビューコントローラ内に表示されたビューコントローラのケースを処理するとどうなりますか?私。現在の子ビューコントローラで 'presentViewController'がチェックされ、代わりにそのビューがスワップされます。それはデザインを破るだろうか? – kolizz

0

あなたはContentModalDetailVCpresentingViewControllerを検査した場合、あなたはそれが実際にContainerVCなくContentPortraitVCが提示されていることがわかります。

これを修正するには、definesPresentationContext(またはInterface Builderの[コンテキストを定義]チェックボックスを使用)をContentPortraitVCに設定する必要があります。

ContentPortraitVCは、プレゼンテーションコンテキスト(デフォルトではルートビューコントローラ)を定義する次のビューコントローラにレスポンダチェーンを渡す代わりに、モーダルプレゼンテーションを処理するように指示します。

ContentLandscapeVCにも同様の問題を回避するためにコンテキストを定義することをお勧めします。

両方の子コントローラが独自のプレゼンテーションコンテキストを定義すると、ContainerVCが子をスワップすることを決定すると、それを提示した子と一緒に新しい階層からモーダルモーダルが削除されます。スワップする前に解雇しようとするとハッキーなことをする必要はありません:)

関連する問題