みなさんこんにちは。
Swiftでアプリを作っていて、全画面ではないモーダルを閉じた際に動かしたい処理があったのですが、閉じたことをどうしても検知してくれなくて困ったので書き記しておこうと思います。
モーダルを閉じた際に、viewDidAppear は呼ばれないのか
呼ばれないんです。正確には全画面のモーダルでは呼ばれますが、遷移元画面に重ねて表示するタイプのモーダルが呼ばれません。
こういうタイプのものですね。
ではどうするか
presentationControllerDidDismiss を使いましょう!
【遷移元】
classの記述にUIAdaptivePresentationControllerDelegateを追加します。
class ViewController: UIViewController, CLLocationManagerDelegate, UIAdaptivePresentationControllerDelegate
遷移させる際にはdelegateを使用
@IBAction func imageTaped(_ sender: UITapGestureRecognizer) {
// Modal を表示する
let ModalController = self.storyboard?.instantiateViewController(withIdentifier: "ModalController") as! ModalController
ModalController.presentationController?.delegate = self
present(ModalController, animated: true, completion: nil)
}
【遷移先】
dismissで画面を閉じる前にdelegateを設定する
func setSliderValue()
{
// モーダルを表示する際にDelegateを設定する
if let presentationController = presentationController
{
presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
}
dismiss(animated: true, completion: nil)
}
【遷移元】
presentationControllerDidDismiss を使って待ち構えます。
func presentationControllerDidDismiss(_ presentationController: UIPresentationController)
{
// モーダルの dismiss を検知
// モーダルが閉じた時に実行したい処理を追加
}
これでモーダルが閉じたことを検知できるようになります。
Comments