【Swift】モーダル表示されたNavigationControllerの子画面で、dismissを使用して画面を閉じたことを元の画面に通知する方法

Swift

こんちには、フリーのITエンジニアでWeb(PHP:Laravel)のバッグエンドをメインにフルリモートでお仕事させて頂きながら、個人開発でiOSアプリを作っているMoritaです。

以前UINavigationControllerを使ったモーダル表示で、画面を下に引っ張って閉じた場合のイベント通知方法を書きましたが、今回はdismissを使った場合の方法になります。

検証環境

Xcode:11.4.1
端末:iPhone 7 Plus
iOS:13.4.1

今回の現象について

前回の記事でモーダルが面を下に引っ張って画面を閉じたことを、呼び出し元の親画面に通知する方法を書きました。

しかし、添付画像の画面で「条件をクリアボタン」を押した際にdismissメソッドで子画面を閉じた場合、親画面に通知されません。

解決方法

今回は呼び出し先の子画面ではUINavigationControllerを使用しています。
ですので、親画面でのモーダル表示部分は以下のようになります。

ポイントとしては、nav.presentationController?.delegate = selfとしているところです。

let vc = ParentViewController.createInstance()
let nav = UINavigationController(rootViewController: vc)
nav.presentationController?.delegate = self
self.present(nav, animated: true, completion: nil)

呼び出し先のdismissメソッドを使用する子画面でdismissメソッドをオーバーライドして処理を追記します。

ポイントはUINavigationControllerのpresentationControllerを取得しているところです。

    override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
        super.dismiss(animated: flag, completion: completion)
        guard let presentationController = self.navigationController?.presentationController else {
            return
        }
        presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
    }

あとは呼び出し元の親画面で通知を受け取れるようにします。

extension Detail6ViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
// 子画面がdismissで閉じれれてもこのイベントが呼ばれます。   
    }
}

まとめ

dismissでもデフォルトでイベントが呼ばれるようにしてくれればいいのに、ちょっと手間がかかりますね。

iOS13のPageSheetでdismissを呼んだ時にもpresentationControllerDidDismissを呼ぶ話 - Qiita
はじめに こんにちは、fummicc1です。今回は、iOS13から変更されたmodalPresentationStyleに.pageSheetを設定した場合の挙動を説明した後に、実際にどういうコードを書くのがいいのかを紹介します...

コメント

タイトルとURLをコピーしました