未分類

モーダルからdissmissで戻った時に処理を行う方法

投稿日:2020年8月10日 更新日:

遷移先が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)
    }
    
}

参考:【Swift5/Xcode】モーダルからdismissで戻ったときに処理をする方法

-未分類

執筆者:

関連記事

no image

APIとは

APIとは、自分がソフトウェアの一部を公開して、他のソフトウェアと機能を共有できるようにしたもの。 こんなイメージ: 企業<うちのサイトの機能の一部を使ってもいいよ。機能を取得するための仕様書を用意し …

no image

CGColorをRGBで指定する方法

uiViewの色指定はUIColorでなく、CGColorになってる。 CGColorをUIColorと同じやり方でRGB指定するとエラーが出る。 一度定数化してから、入れたら解決した。 let cu …

no image

StaticCellでコードからセルに変更を加えたい時の対処法

StaticCellだと、セルに情報を入れるメソッドfunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath …

no image

vtuberのグリーンバックを消す方法

プロジェクトパネルのエフェクトを選択する。 ビデオエフェクトのタブを開く。 キーイング→ultraキーを選択する。 グリーンバックの素材にドラッグ&ドロップする。 ソースパネルのultraキー …

プレミアプロ講座基礎編2_テロップ入れ

いろんなテロップの入れ方を学ぶ。 エッセンシャルグラフィック エッセンシャルグラフィック:テロップ(文字)周りの装飾を一つのクリップで作れるので便利。 動画と文字でマスクを使うこともできる。(文字の中 …