Lazily覆盖IBOutlet对象的属性

JAL*_*JAL 0 uitextview iboutlet becomefirstresponder ios swift

我有一个自定义UItextView子类,我覆盖canBecomeFirstResponder():

class MyTextView: UITextView {

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */

    override func canBecomeFirstResponder() -> Bool {
        return false
    }

}
Run Code Online (Sandbox Code Playgroud)

我这样做是为了允许数据检测链接(电话号码是URL)在一个UITextView功能中,而视图中没有任何其他文本是可选择的,但这与问题无关.

canBecomeFirstResponder()是我想要覆盖的唯一属性/方法,因此子类化似乎有点过分.我将此自定义类与使用Interface Builder创建的视图一起使用.有没有办法可以懒惰地覆盖UIKit对象属性的IBOutlet?像这样的东西:

@IBOutlet weak var contactTextView: UITextView! {
    override func canBecomeFirstResponder: Bool = {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

我不想使用扩展,UITextView因为我只想覆盖canBecomeFirstResponder()特定的UITextView,而不是我的项目中使用的每一个.

Sul*_*han 6

如果要覆盖,必须子类化.这两个概念是相互关联的.没有子类化就无法覆盖.

你的"喜欢这个"的想法不适用于任何语言.基本上,您正在描述一个Java中可用的匿名子类(不在Swift中).但是,这必须在类实例化期间使用,而不是在声明变量时使用.

当然,您可以canBecomeFirstResponder通过返回的方法来调整false,didSet但这比子类化要复杂得多.