延迟覆盖 IBOutlet 对象的属性

Lazily Override IBOutlet Object's Properties

我有一个自定义 UItextView subclass,我在其中覆盖了 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 中检测到的数据链接(phone 数字是 URL)在视图中没有任何其他文本可供选择的情况下运行,但是与问题无关。

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

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

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

如果你想覆盖,你 subclass。这两个概念是相互关联的。没有 subclassing 就不能覆盖。

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

当然,您可以使用在 didSet 中返回 false 的方法调配 canBecomeFirstResponder,但这比 subclassing 复杂得多。

答案是 swift 的当前版本无法做到这一点。

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

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