Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はいどうもこんにちは

相変わらず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を使った方が保守性は高いかもしれませんが、簡単なものならこれでもいいですね

marienplatz
自社でiOSとandroidとAPIと管理画面開発をしています。全部です。 プライベートではdjangoとアルゴリズムが好きです(paiza S) ラズパイをサーバー化したので現在マッチングアプリを作っています。(kotlin, django) 【経歴】 DQN高卒 →ガリレオの再放送を見て理転 →二年宅浪 →慶應理工卒 →SES→自社開発(2019/1 ~)
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした