🦅

【Swift5】全画面にならなくなったモーダル表示を閉じた時にviewWillAppearではなくイベント取得する

2022/02/09に公開

何がやりたいか

iOS13では以下のように書けば、全画面ではなく、半分のモーダル表示されるようになりました。
スワイプで閉じられるようなモーダル表示です。

        let vc = CreateViewViewController(isSelectedFolderName: model.selectedCategoryName)
        let nav = UINavigationController(rootViewController: vc)

        self.present(nav, animated: true, completion: nil)

ここでnav.modalPresentationStyle = .fullScreenと表記するとiOS12以前のように全画面で表示されます。

iOS13以降で問題となる点

半分のモーダル表示をスワイプで閉じた際に、元々開いていたViewControllerのライフサイクルのoverride func viewWillAppear(_ animated: Bool) {でイベントを取得できないんですよね。iOS12以前であれば再表示される都度に呼び出されているライフサイクルでしたのでイベント取得というか、ここで処理することはできました。

解決法(遷移元)

こちらはモーダル表示する際の画面です。
NavigationController付きのViewControllerでも、表示されるViewController自体にdelegateを指定してあげてください。

    @objc func didTapCreateDeckButton() {
        guard let model = myModel else { return }
        let vc = CreateViewViewController(isSelectedFolderName: model.selectedCategoryName)
        let nav = UINavigationController(rootViewController: vc)
        vc.presentationController?.delegate = self

        self.present(nav, animated: true, completion: nil)
    }
    // MARK: Modal(半分以下)を閉じる時のイベントを取得する

extension ListViewViewController: UIAdaptivePresentationControllerDelegate {
  func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
    print("Closed.")
  }
}

解決法(遷移先 ※モーダル表示されている方)

            self.dismiss(animated: true, completion: nil)
            guard let presentationController = presentationController else {
                return
            }
            presentationController.delegate?.presentationControllerDidDismiss?(presentationController)

思考の助け

今回ですと、レシピ一覧表示から「新規レシピ作成画面」へ遷移できて、
そこでレシピを作成すると、一覧画面で表示する項目が増えているので、
イベント取得したかったのでこのような実装にしました。

参考となった記事は以下です。こちらの画像付きももしよかったら閲覧してみるといいです。
https://satoriku.com/modally-dismiss/

Discussion