この記事は最終更新日から1年以上が経過しています。
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 Screen か Current Context に変更するとiOS12以前のModal遷移になります。
この記事を書いた人
-
2018年入社の新卒です。
iOSアプリの開発やCI環境の構築・管理をしています。
最近書いた記事
- 2022.12.10Visual Regression Testingを導入してみた(iOSアプリ)
- 2019.10.23iOSアプリのバージョンとApp Extensionのバージョンを合わせる
- 2019.10.21Xcode 11でUIScrollViewのAutoLayoutの制約のかけ方が変わった
- 2019.10.18BitriseでiOSのビルド速度を上げる