📝

Present Modallyでの遷移先画面でdismissした時に 遷移元画面のViewを更新する

2022/06/30に公開

実現したいこと

TableViewを部品として持つViewから、Buttonを押して次のViewへPresent Modallyの遷移をさせる。その遷移先画面でTableViewに新しいセルを追加する処理を行ったあと、遷移元画面へdismissし、TableViewの更新を行う。

解決方法

遷移先画面にて、ViewWillDisappear内に

if #available(iOS 13.0, *) {
    presentingViewController?.beginAppearanceTransition(true, animated: animated)
}

を記述しつつ、遷移元画面のViewWillAppear内でTableView.reloadData()を記述する。
(iOS13以上の場合に処理を行うようにしないと、iOS12以下の端末で実行してしまった時に二重にライフサイクルメソッドが実行されてしまう)

解釈

presentingViewController?.beginAppearanceTransition(true, animated: animated)について。
 まず前提として、Modal遷移元画面のViewControllerがpresentingViewControllerであり、その先にModal表示しているViewControllerがpresentedViewControllerである。
 そのメソッドであるbeginAppearanceTransition(true, animated: animated)を遷移先のviewWillDisappear内で記述し、第一引数をtrueにすることによって任意のタイミングで遷移元のViewWillAppear()を呼び出すことができる。
つまりここでは、遷移先画面が閉じる直前のタイミングで、遷移元画面のViewWillAppear()を呼び出しているということである。

うまくいかなかった理由

単に、遷移元のViewWillAppear内でTableView.reLoadData()を記述していた。これでTableViewは更新されると思っていたが、更新はされなかった。
 調べてみると、多くの方の記事で「iOS13以上では、Modal遷移がフルスクリーン型ではなくシート型になったために、dismissした際に遷移元画面のviewWillAppearが呼ばれなくなった」と書いてあった。(ちなみに遷移を「フルスクリーン型」にするときちんと呼ばれるらしい)

Discussion