我有一个自定义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
。
答案 0 :(得分:6)
如果要覆盖,则具有子类。这两个概念是相互关联的。没有子类化就无法覆盖。
你的“喜欢这个”的想法不适用于任何语言。基本上,您正在描述一个Java中可用的匿名子类(不在Swift中)。但是,这必须在类实例化期间使用,而不是在声明变量时使用。
当然,您可以使用canBecomeFirstResponder
中返回false
的方法调用didSet
,但这比子类化要复杂得多。
答案 1 :(得分:0)
答案是,对于当前版本的swift,没有办法做到这一点。
根据您所描述的内容,您可能可以使视图控制器实现UITextViewDelegate
并实现textViewShouldBeginEditing
以返回false。
这只是基于您似乎试图覆盖canBecomeFirstResponder
以禁止输入这一事实的猜测。
如上所述,如果从canBecomeFirstResponder
返回false,我认为预期的行为是UI元素将不再允许自己捕获用户输入。根据您在评论中的回复,无论如何它似乎都在为您捕获用户输入,但这可能只是您正在运行的iOS的特定版本。也可能是我对第一响应者链的理解不正确。