Swiftでdelegateを使ってViewからViewControllerにアクションを渡す

こんにちは。がわわです。

Viewのサブクラスでボタンがタップされるなどのイベントを検知した時に、Viewで処理するのではなくViewControllerで処理した方が設計として綺麗だと思っています。

そういう時にdelegateを使いましょう。
delegateとは簡単に言えば処理を肩代わりしてくれる存在です。

import UIKit

protocol MyDelegate: class {
    func didTappedButton()
}

class MyView: UIView {

    weak var delegate: MyDelegate? = nil
    @IBOutlet weak var button: UIButton!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
    
    @IBAction func tappedButton(sender: AnyObject) {
        self.delegate?.didTappeButton()
    }
}
import UIKit

class MyViewController: UIViewController, MyDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func didTappedButton() {
        println("test")
    }
}

これでMyViewでボタンをタップすると"test"と表示されます。