Swift 独自ViewのDelegateをオーバライドする


概要

例えば、TextViewの変更を検知して、Viewの色を変えるという独自拡張Viewがあったとする。

class UIChangeColorTextView: UITextView {
    override init(frame: CGRect) {
        delegate = self
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

extension UIChangeColorTextView: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        titleTextView.layer.borderColor = UIColor.red.cgColor
    }
}

で、この時、このViewを使用するViewControllerでも色の変更処理をしつつ新たにtextViewDidChangeに追加処理を記述したい場合。

ViewController

独自拡張Viewのインスタンスからdelegateメソッドにアクセスできる。superだとViewControllerの親クラスになってしまうので注意。

class ViewController: UIViewController {
    var textView = UIChangeColorTextView()
    textView.delegate = self
}

extension ViewController: UITextViewDelegate{
    func textViewDidChange(_ textView: UITextView) {
        //これで独自拡張のdelegateメソッドを呼び出せる
        self.textView.textViewDidChange(textView)
       //...追加処理を記述
    }
}