Present Modallyでの遷移先画面でdismissした時に 遷移元画面のViewを更新する
実現したいこと
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