目次

目次

iOS13のModal遷移はデフォルトだとDismiss時に遷移元のviewWillAppear等が呼ばれない

アバター画像
村田真矢
アバター画像
村田真矢
最終更新日2019/10/16 投稿日2019/10/16

iOS13からデフォルトのModal遷移がシート型に変更になりました。 スワイプでVCをDismissできたり遷移元の画面が見えたりといい感じにはなりましたが、 Dismiss時に遷移元のライフサイクルメソッドが呼ばれません。

printした結果

ViewController.viewWillAppear
ViewController.viewDidAppear
SecondViewController.viewWillAppear
SecondViewController.viewDidAppear
SecondViewController.viewWillDisappear
----- ここにViewController.viewWillAppearがあるべき ----- 
SecondViewController.viewDidDisappear
----- ここにViewController.viewDidAppearがあるべき ----- 

このModal遷移の場合は各ライフサイクルメソッドで presentingViewController?.beginAppearanceTransition(false, animated: animated)presentingViewController?.endAppearanceTransition() を呼んであげることで遷移元のライフサイクルメソッドも呼ばれるようになります。 ただ、iOS12以前でこの処理が書かれていると2重にライフサイクルメソッドが呼ばれてしまうので、iOS13以降でのみ実装されるように書く必要があります。

    override func viewWillAppear(_ animated: Bool) {
        presentingViewController?.beginAppearanceTransition(false, animated: animated)
        super.viewWillAppear(animated)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        presentingViewController?.endAppearanceTransition()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        presentingViewController?.beginAppearanceTransition(true, animated: animated)
        presentingViewController?.endAppearanceTransition()
    }

参考

printした結果

ViewController.viewWillAppear
ViewController.viewDidAppear
ViewController.viewWillDisappear
SecondViewController.viewWillAppear
ViewController.viewDidDisappear
ViewController.viewWillAppear
ViewController.viewDidAppear //  SecondViewController.viewDidDisappearでpresentingViewControllerがnilになってしまうため順番はずれてしまう・・・
SecondViewController.viewWillDisappear
SecondViewController.viewDidDisappear

ちなみに、segueのPresentationを Full ScreenCurrent Context に変更するとiOS12以前のModal遷移になります。

ib.png
アバター画像

村田真矢

2018年入社の新卒です。
EMやっています。

目次