したいこと
例えば、こんな感じでボタンの設置されたクラスがある
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)