#概要
iOS13からModalで画面遷移した際のアニメーションが変更されました。
それによって、Modal画面を閉じた際に動くライフサイクルメソッドが変わりました。
(今まではViewWillAppearが動いていたので、そこで更新等の処理を書いていた人も多いはず。困った、、、)
Modalで表示した子画面の閉じるイベントを親画面で検知する方法を備忘として残しておきます。
#環境
Xcode: 11.4
Swift: Swift5
#手順1
適当なViewControllerクラスを2つ用意します。
今回は遷移元を「ParentViewController」遷移先を「ChildViewController」としたいため、以下4ファイルを作成します。
・ParentViewController.swit
・Parent.storyboard
・ChildViewController.swit
・Child.storyboard
Parent.storyboardのInitialViewControllerに「ParentViewController」を、
Child.storyboardのInitialViewControllerに「ChildViewController」をそれぞれ設定してください。
import UIKit
final class ParentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
import UIKit
final class ChildViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
#手順2
ChildViewControllerが閉じた際のイベントは以下のメソッドで検知可能です。
- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
「UIAdaptivePresentationControllerDelegate」に準拠することで使用可能です。
ParentViewControllerに以下を実装します。
import UIKit
final class ParentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let storyboard = UIStoryboard.init(name: "Child", bundle: nil)
guard let vc = storyboard.instantiateInitialViewController() else {
fatalError("Can not generate vc.")
}
// delegateを設定
vc.presentationController?.delegate = self
self.present(vc, animated: true, completion: nil)
}
}
extension ParentViewController: UIAdaptivePresentationControllerDelegate {
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
// ChildViewControllerのDismissを検知
print("Closed.")
}
}
#最後に
iOS13が出てから半年以上経っているのに調べるまで知りませんでした。
ライフサイクルメソッドに書かなくていいので実装がスッキリしますね!
誰かのお役に立てれば幸いです!