如何禁用 NSTextView 的用户交互?

dua*_*uan 2 macos cocoa swift

在 Cocoa Touch 中,您可以禁用文本视图的用户交互,如下所示:

let textView = UITextView()
textView.isUserInteractionEnabled = false
Run Code Online (Sandbox Code Playgroud)

但是在 Cocoa 中,NSTextView 没有这么容易使用的 API。
那么禁用 NSTextView 用户交互的正确方法是什么?

dua*_*uan 5

您可以editable 通过以下方式禁用它:

textView.isEditable = false
Run Code Online (Sandbox Code Playgroud)

它的'selectable由:

textView.isSelectable = false
Run Code Online (Sandbox Code Playgroud)

但是,当您同时禁用它们时。这个 textView 仍然会拦截 Mouse-down 事件,这与isUserInteractionEnabled .

所以,现在,为了启用点击,我的解决方案是子类化 aNSTextView并覆盖它的'hitTest:

class TextView: NSTextView {
  override func hitTest(_ point: NSPoint) -> NSView? {
    return nil
  }
}
Run Code Online (Sandbox Code Playgroud)

一个封装的方式在这里

class StaticTextView: NSTextView {
  override init(frame frameRect: NSRect) {
    super.init(frame: frameRect)
  }

  override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) {
    super.init(frame: frameRect, textContainer: container)
  }

  required init?(coder: NSCoder) {
    super.init(coder: coder)
  }

  override func hitTest(_ point: NSPoint) -> NSView? {
    return nil
  }
}
Run Code Online (Sandbox Code Playgroud)