遷移先がModalの場合、遷移先から戻った時に呼ばれるメソッドviewWillApperが使えない。
遷移先を.fullscreenに変更することでviewWillApperが使えるようになるが、ここではModalのままで遷移先から戻った時の処理を行う方法を記す。
モーダルから戻った時の処理はpresentationControllerDidDismissを使う
presentationControllerDidDismissメソッドを使うことで、モーダルからdissmissで戻った時の処理を行える。
参考:presentationControllerDidDismiss(_:)
準備
StoryBardIDによる画面遷移を行う必要がある。
Segueによる画面遷移では使えないので注意。
追加ボタンを押すと、モーダルで画面遷移→キャンセルボタンを押すと元の画面に戻る

import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//追加ボタン
@IBAction func addBtn(_ sender: Any) {
let NextViewController = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.present(NextViewController, animated: true, completion: nil)
}
}
import UIKit
class NextViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//キャンセルボタン
@IBAction func cancelBtn(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
}
1. 遷移の記述にdelegateを追加する
遷移元の遷移する記述に以下のコードを追加してデリゲートを設定する。
(※この時点ではエラーが出る)
nextViewController.presentationController?.delegate = self
//追加ボタン
@IBAction func addBtn(_ sender: Any) {
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
nextViewController.presentationController?.delegate = self //←追加する
self.present(nextViewController, animated: true, completion: nil)
}
2. 遷移元にextensionを追加する
遷移元に以下のextensionを追加して、presentationControllerDidDismissメソッドを書く。
(extentionの位置はクラスの宣言外に書く必要がある。import UIKitの下らへん。)
extension ViewController: UIAdaptivePresentationControllerDelegate {
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
//dissmissで戻ってきた時の処理
print("遷移先から戻りました")
}
}
3. 遷移先にextensionを追加する
遷移先に以下のextensionを追加して、dissmissメソッドをオーバーライドする。
(NextViewControllerのところはそのクラスの名前を書く。)
extension NextViewController {
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag, completion: completion)
guard let presentationController = presentationController else {
return
}
presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
}
}
これでモーダルの遷移先からdissmissで戻った時に、presentationControllerDidDismissメソッドに記述した処理が実行されるようになる。tableViewのreloadなどに使える。
キャンセルボタンを押して元画面に戻ると、処理が実行される↓

全てのコード
import UIKit
extension ViewController: UIAdaptivePresentationControllerDelegate {
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
//dissmissで戻ってきた時の処理
print("遷移先から戻りました")
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//追加ボタン
@IBAction func addBtn(_ sender: Any) {
let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
nextViewController.presentationController?.delegate = self //←追加する
self.present(nextViewController, animated: true, completion: nil)
}
}
import UIKit
extension NextViewController {
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag, completion: completion)
guard let presentationController = presentationController else {
return
}
presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
}
}
class NextViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//キャンセルボタン
@IBAction func cancelBtn(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
}