2021年8月18日水曜日

dismiss がコールされたときに元の画面でイベントをハンドリングする方法

dismiss がコールされたときに元の画面でイベントをハンドリングする方法

概要

iOS13 以降で仕様が変わっているようです presentationControllerDidDismiss を実装する必要があります

環境

  • macOS 11.5
  • Xcode 12.5.1

元の画面で実装するコード

import UIKit

extension HomeViewController: UIAdaptivePresentationControllerDelegate {
    // NewViewController から戻ったときに呼ばれる
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        // ここは好きなコードに書き換えて OK
        self.viewDidLoad()
    }
}

class HomeViewController: UIViewController {
    
    override func viewDidLoad() {
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "toNextViewController") {
            let nextvc: NextViewController = (segue.destination as? NextViewController)!
            // 以下が重要
            nextvc.presentationController?.delegate = self
        }
    }
}

HomeViewController -> NextViewController の画面遷移は storyboard を使っているので prepare を実装しています

遷移先の画面で実装するコード

extension NextViewController {
    override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
        super.dismiss(animated: flag, completion: completion)
        guard let presentationController = presentationController else {
            return
        }
        if #available(iOS 13.0, *) {
            presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
        } else {
            // Fallback on earlier versions
        }
    }
}

class NextViewController: UIViewController {

    @IBAction func backToHome(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }

}

dismiss するボタンを設置することを想定していますがスワイプで消しても同じです

最後に

iOS12 以下もサポートしている場合は viewWillDisappear を HomeViewController に実装しておいたほうがいいかもしれないです

参考サイト

0 件のコメント:

コメントを投稿