LoginSignup
5

More than 5 years have passed since last update.

[Swift4] ボタンのクリックイベントを別クラスで拾う

Last updated at Posted at 2018-02-20

したいこと

例えば、こんな感じでボタンの設置されたクラスがある

class ItemView: UIView {

    func hogehoge() {
        let btn = UIButton()
        btn.addTarget(self, action: #selector(self.btnClick(btn: )), for: .touchUpInside)
        self.addSubview(btn)
    }

    @objc func btnClick(btn: UIButton) {
        print("btn clicked")
    }

}

このクリックイベントをViewControllerクラスでも拾いたい! ということ

class Box_VC: UIViewController {
    @IBOutlet weak var itemView: ItemView!

    // itemViewのクリックイベントを拾って色々したい!
}

簡単

まずは、イベントのターゲットを追加

class ItemView: UIView {

    func hogehoge() {
        let btn = UIButton()
        btn.addTarget(self, action: #selector(self.btnClick(btn: )), for: .touchUpInside)

        // 追加
        btn.addTarget(nil, action: #selector(Box_VC.btnClick(btn:)), for: .touchUpInside)

        self.addSubview(btn)
    }

    @objc func btnClick(btn: UIButton) {
        print("btn clicked")
    }

}

次に、ViewControllerでちゃんと拾ってあげる

class Box_VC: UIViewController {
    @IBOutlet weak var itemView: ItemView!

    // 追加
    @objc func btnClick(btn: UIButton) {
        print("yeah")
    }
}

備考

  • イベントはターゲット指定順に呼ばれる
  • 追加したaddTargetの第一引数は、Box_VC()でも可。違いはResponderCahinで発火させるかどうか。
// これもok
btn.addTarget(Box_VC(), action: #selector(Box_VC.btnClick(btn:)), for: .touchUpInside)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5