延迟覆盖 IBOutlet 对象的属性



我有一个自定义的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()是我想要覆盖的唯一属性/方法,所以子类化似乎有些过头了。我将这个自定义类与使用接口生成器创建的视图一起使用。有没有一种方法可以延迟覆盖UIKit对象属性的IBOutlet?类似这样的东西:

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

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

如果您想覆盖,您有子类。这两个概念是相互联系的。不进行子类化就无法覆盖。

你的"像这样"的想法在任何语言中都行不通。基本上,您描述的是一个匿名子类,例如在Java中可用(在Swift中不可用(。然而,这必须在类实例化期间使用,而不是在声明变量时使用。

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

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

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

话虽如此,正如前面所指出的,如果您从canBecomeFirstResponder返回false,我认为预期的行为是UI元素将不再允许自己捕获用户输入。从你在评论中的回复来看,它似乎为你捕捉了用户输入,但这可能只是你运行的特定版本的iOS。也可能是我对第一响应者链的理解不正确。

最新更新