5

カスタム コンテナ ビュー コントローラがあります: ContainerVC. ContentPortraitVCその仕事は、現在の向きに応じて、またはの 2 つのコンテンツ ビュー コントローラーのいずれかを提示するContentLandscapeVCことです (コンテナーがビューを選択する理由は関係ありませんが、私は推測します)。ContentPortraitVC、ある時点でポップアップしContentModalDetailVCます。

したがって、ここで新しいコンテンツを表示する方法は 2 つあります。

  • 親子関係 ( によって開始addChildViewControllerされ、 によって削除されるremoveFromParentViewController)、

  • 提示と提示の関係 ( によって開始presentViewControllerされ、 によって削除されdismissViewControllerます)。

ContainerVCを追加しContentPortraitVC、 が を提示しContentModalDetailVCContainerVCが に切り替えることを決定したContentLandscapeVC場合、 は表示されたContentModalDetailVCままになります (親が削除されたときに削除されないのはなぜですか?)

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

4

2 に答える 2

5
  1. addChildViewControllerを追加するために使用する場合ContentPortraitVC

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

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

  2. ContentPortraitVCthen はdisplaypresentViewControllerを呼び出しますContentModalDetailVC

    を。これにより、そのpresentingViewControllerプロパティが設定され (デバッガーでは、これは_parentModalViewControllerivar として表示されます。ivar はプロパティとは異なることに注意してください)、(誰が ivar であるか) のpresentedModalViewControllerプロパティを設定します。ContentPortraitVC_childModalViewcontroller

    b. ビューに関しては、iPhone では、のビューがおよびContentModalDetailVCのビューを完全に置き換えるため、モーダル ビュー コントローラーのビューのみが表示されます。(iPad では、新しい UI を上に重ねますが、のビューの兄弟として、つまりのビューの親になります)。ContentPortraitVCContainerVCControllerVCContentPortraitVC

  3. では、 から に移行しContentPortraitVCますContentLandscapeVC

    を。IOS はちょっとした魔法を行います。削除しようとしているもの ( ContentPortraitVC) がpresentedViewController現在アクティブであることを認識しているため、その親を変更します。値をnilonに設定しContentPortraitVC、子 ( ContentModalDetailVC) を受け取り、その親を新しいビュー ( ContentLandscapeVC) に設定します。そのため、モーダル ビューを提示したビュー コントローラーは、もはやその提示ビュー コントローラーではありませんContentLandscapeVCそもそもそれを提示したかのようです!

    b. ビューに関しては、Apple のドキュメントに従って、ビューを から に切り替えContentPortraitVCますContentLandscapeVC。ただし、ControllerVCのビューのサブビューを変更しているだけです。iPhone では、まだモーダル ビュー コントローラーのみが表示されているため、変更を行っても画面には何も表示されません。iPad では表示されます (ただし、モーダル ビューは通常全画面表示であるため、表示されない可能性があります)。

  4. ここで、モーダル ビューを閉じます。でこれを行うと思われますがContentPortraitVC、提示されたものへの参照はもうありません。はもはや何も提示しないため、呼び出し[self dismissViewController...は何もしません。その責任は に渡されます。ContentPortraitVCContentLandscapeVC

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

  1. ContentPortraitVCからに変更するときにデリゲートを手動で再配線できるContentLandscapeVCため、後者はモーダル コントローラーを却下しようとするものです。

  2. でモーダルコントローラーを閉じることができます[self dismissModalControllerAnimated:YES completion:nil]。奇妙に思える場合は、なぜそれが機能するのか (IOS はどのように却下するかを知ることができますか?) について別の質問をして回答します。

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

于 2013-08-04T20:36:51.237 に答える
2

を調べるpresentingViewControllerと、実際にはではなくContentModalDetailVCによって表示されていることがわかります。ContainerVCContentPortraitVC

これを修正するには、 on を設定definesPresentationContext(または Interface Builder の [Defines Context] チェックボックスを使用) するだけContentPortraitVCです。

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

ContentLandscapeVC同じ問題を回避するために、おそらくコンテキストも定義する必要があります。

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

編集:表示されるView Controllerには、そのmodalPresentationStyleSet が または のいずれcurrentContextoverCurrentContextに設定されている必要があることを追加する必要があります。

于 2016-07-02T18:07:55.697 に答える