web-dev-qa-db-ja.com

iOS 13のpresentationControllerDidDismiss()がコンパクト環境のポップオーバーで呼び出されない

IOS 13の新しい「カードスタイル」モーダルビュー用にアプリを更新しています。 UIAdaptivePresentationControllerDelegatepresentationControllerDidAttemptToDismiss()関数とpresentationControllerDidDismiss()関数を使用すると、すべてがうまく機能しています。ただし、_.modalPresentationStyle_が_.popover_に設定されているビューの場合、コンパクトな環境(電話またはiPadがスプリットまたはスライドオーバーになっているなど)で表示される場合、presentationControllerDidDismiss()は呼び出されません。 。通常のサイズのクラス環境(iPadのフルスクリーンなど)で表示されると、正しく呼び出されます。

これを設定する私のコードはかなり簡単です:

ポップオーバーを表すコード:

_func showChooser() {
    // other setup code...
    navController.modalPresentationStyle = .popover
    navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
    self.present(navController, animated: true)
}
_

次に、提示されたコントローラーはUIAdaptivePresentationControllerDelegateに準拠してセットアップします。

_// This is in the presented view controller (i.e. the popover)
override func viewDidLoad() {
    // other setup removed for brevity…
    self.navigationController?.presentationController?.delegate = self
}

func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
    print("did dismiss")
    self.cancel?()
}
_

通常のサイズクラス環境でビューが表示されると、ポップオーバーとして正しく表示されます。ユーザーがポップオーバーの外側をタップすると、presentationControllerDidDismiss()が呼び出されます。ただし、同じコードがコンパクトな環境で表示されると、それは(カードスタイルとして)正しく表示されますが、ユーザーがビューを下にドラッグすると、presentationControllerDidDismiss()は呼び出されません。

_.modalPresentationStyle_を_.pageSheet_や_.formSheet_などの他のものに変更すると、コンパクトプレゼンテーションまたは通常のプレゼンテーションのいずれでも期待どおりに機能します。

デリゲートのadaptivePresentationStyle()を使用してコンパクト環境でスタイルを_.formSheet_に変更しようとしましたが、presentationControllerDidDismiss()はまだ正しく呼び出されていません。

pdate:現在の回避策はサイズクラスを確認し、必要に応じて_.modalPresentationStyle_を変更することです。

_if self.traitCollection.horizontalSizeClass == .compact {
    navController.modalPresentationStyle = .automatic
} else {
    navController.modalPresentationStyle = .popover
    navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
}
_

これは機能しますが、_.popover_スタイルを使用するだけで適切に適応し、適切なデリゲートメソッドを呼び出すようです。

pdate 2:上記のコードを更新して、presentedビューコントローラがデリゲートメソッドを処理するコントローラであることを明確にしました。

また、これをさらに掘り下げた後、presentingビューコントローラがデリゲートであり、デリゲートメソッドを処理する場合、これはすべて期待どおりに機能することに気付きました。コンパクトな環境ですべての_.modalPresentationStyle_のexceptポップオーバーのpresentedビューコントローラーでも機能するため、おそらくいくつかのポップオーバーがそのように提示されるときの生涯の問題?

私が間違っている可能性があることについて何か考えはありますか?

3
coping

self.present(navController, animated: true)の後にnavController.presentationController?.delegate = // * navController.viewControllers[0]を入れます。そうしないと、presentationControllerがnilになる可能性があります

0
Cecilia Humlelu

その例のヒープに感謝します-マットの詳細を拡張し、一般的な例(スタンドアロンのviewControllerの作成)を探している人のために、以下のようなものも機能するはずだと思います:

func presentExampleViewController() {
    // Any other setup code specific to the view in your app can go here...
    let exampleViewController = SomeCustomViewController()
    exampleViewController.presentationController?.delegate = exampleViewController
    self.present(exampleViewController, animated: true)
}
0
michaelrbg