25
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】Modalで表示した子画面の閉じるイベントを親画面で検知する

Last updated at Posted at 2020-04-03

#概要
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」をそれぞれ設定してください。

ParentViewController.swift
import UIKit

final class ParentViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
  }
}
ChildViewController.swift
import UIKit

final class ChildViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
  }
}

#手順2
ChildViewControllerが閉じた際のイベントは以下のメソッドで検知可能です。

.swift
- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController

「UIAdaptivePresentationControllerDelegate」に準拠することで使用可能です。
ParentViewControllerに以下を実装します。

ParentViewController.swift
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が出てから半年以上経っているのに調べるまで知りませんでした。
ライフサイクルメソッドに書かなくていいので実装がスッキリしますね!
誰かのお役に立てれば幸いです!

25
24
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?