Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
23
Help us understand the problem. What are the problem?

posted at

updated at

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

概要

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が閉じた際のイベントは以下のメソッドで検知可能です。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
23
Help us understand the problem. What are the problem?