swiftでポップアップの値渡しを簡単に実装する方法


はいどうもこんにちは

相変わらずGithubがろくすっぽ使えませんが何とか生きています

いつもハマった話ばかり書いていますが、今日は別にハマっていないけど、デリゲートでコールバックするより綺麗だなと思ったので書きます!

デリゲートは沢山コールバックをするならひとまとめにできるのでわかりやすいのですが、一つコールバックしたいってくらいだとこっちのがシンプルで楽な気がします。

特にポップアップが閉じられた時にコールバックしたことってよくあると思うのですが、今回はそれです。

方針としては

1. ポップアップのコントローラに"メソッドの入れ物"を配置
2. ポップアップを開く前のコントローラに、ポップアップを開くときのコードと、ポップアップが閉じたあとの処理を実装
3. ポップアップのコントローラに閉じるボタンを押されたときの処理を実装

こんな流れです

それではまずは

1. ポップアップのコントローラに"メソッドの入れ物"を配置

メソッドの入れ物です。今はまだ空っぽです。
これを置いておくことで、渡されたメソッドをポップアップのクラスで実行することができます。

PopupVC.swift
class PopupVC: UIViewController {
    // メソッドの入れ物みたいなものです
    var emptyClosure: (() -> Void)?
}

2. ポップアップを開く前のコントローラに、ポップアップを開く前の処理と閉じた後にやりたい処理を実装

特筆すべき点はありませんが、ポップアップのVCの開き方はケースバイケースなのでよしなにお願いします。

SomeVC.swift
class SomeVC: UIViewController {
    func showPopup(){
        let pupupVC = ()何かしらの方法でポップアップのコントローラをここに
        // ここで入れ物にメソッドを渡します
        pupupVC.emptyClosure = {self.hogeMethod()}
        // (ここで何かしらの方法でポップアップを開く処理を書きます)
    }
    func hogeMethod(){
        // (ポップアップが消えたときにやりたい処理)
    }
}

3. ポップアップのコントローラに閉じるボタンを押されたときのコールバック処理を実装

既に2.で空だった入れ物にはメソッドが入りました。

そしてここでdismiss()のcompletionにて、閉じるときにSomeVCで定義したメソッドを発動します。

PopupVC.swift
class PopupVC:UIViewController {
    // 空の入れ物でしたが、既にこいつはメソッドをもっています
    var emptyClosure: (() -> Void)?

    @IBAction func closeBtnAction(_ sender: UIButton) {
        self.dismiss(animated: false, completion: {
            // UIViewControllerが閉じられると共に実行します
            self?.emptyClosure!()
        })
    }
}

こんな感じでシンプルにコールバック処理が書けました。

コールバックの量が多い場合はdelegateを使った方が保守性は高いかもしれませんが、簡単なものならこれでもいいですね