Swift xibのViewイベントをViewControllerに定義する


xibと対となるViewはレイアウトのみの定義で、イベント着火による振る舞いはViewControllerに書きたいことがある。

HogeView.xibとUIViewを継承したHogeView.swiftというファイルが定義されていたとすると、

HogeView.swift

class HogeView: UIView {
    
    @IBOutlet weak var actionButton: UIButton!
    
    class func instanceFromNib() -> UIView {
        return UINib(nibName: "HogeView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
    }
    
}

HogeViewControllerで、xibのviewに対してaddTargetすればよい。

class HogeViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let view = HogeView.instanceFromNib() as? HogeView
        view?.actionButton.addTarget(self, action: #selector(handleActionButton), for: .touchUpInside)
        ...
    }
    @objc func handleActionButton(sender: UIButton) {
        //doAction
    }
}