Lazily覆盖IBOutlet对象的属性

时间:2015-07-28 18:29:23

标签: ios swift uitextview iboutlet becomefirstresponder

我有一个自定义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
    }

}

我这样做是为了让UITextView中的数据检测链接(电话号码是URL)能够在视图中没有任何其他文本可供选择的情况下运行,但这与问题无关。

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

@IBOutlet weak var contactTextView: UITextView! {
    override func canBecomeFirstResponder: Bool = {
        return false
    }
}

我不想在UITextView上使用扩展程序,因为我只想覆盖特定canBecomeFirstResponder()的{​​{1}},而不是我项目中使用的每个UITextView

2 个答案:

答案 0 :(得分:6)

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

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

当然,您可以使用canBecomeFirstResponder中返回false的方法调用didSet,但这比子类化要复杂得多。

答案 1 :(得分:0)

答案是,对于当前版本的swift,没有办法做到这一点。

根据您所描述的内容,您可能可以使视图控制器实现UITextViewDelegate并实现textViewShouldBeginEditing以返回false。 这只是基于您似乎试图覆盖canBecomeFirstResponder以禁止输入这一事实的猜测。

如上所述,如果从canBecomeFirstResponder返回false,我认为预期的行为是UI元素将不再允许自己捕获用户输入。根据您在评论中的回复,无论如何它似乎都在为您捕获用户输入,但这可能只是您正在运行的iOS的特定版本。也可能是我对第一响应者链的理解不正确。