我有一个自定义的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
上使用扩展,因为我只想覆盖特定UITextView
的canBecomeFirstResponder()
,而不是我项目中使用的每一个。
如果您想覆盖,您有子类。这两个概念是相互联系的。不进行子类化就无法覆盖。
你的"像这样"的想法在任何语言中都行不通。基本上,您描述的是一个匿名子类,例如在Java中可用(在Swift中不可用(。然而,这必须在类实例化期间使用,而不是在声明变量时使用。
当然,您可以在didSet
中使用返回false
的方法来刷新canBecomeFirstResponder
,但这比子类化要复杂得多。
答案是,对于swift的当前版本,没有办法做到这一点。
根据您所描述的内容,您可能会使视图控制器实现UITextViewDelegate
并实现textViewShouldBeginEditing
以返回false。这只是基于您似乎试图覆盖canBecomeFirstResponder
以禁止键入这一事实的猜测。
话虽如此,正如前面所指出的,如果您从canBecomeFirstResponder
返回false,我认为预期的行为是UI元素将不再允许自己捕获用户输入。从你在评论中的回复来看,它似乎为你捕捉了用户输入,但这可能只是你运行的特定版本的iOS。也可能是我对第一响应者链的理解不正确。