如何禁用 NSTextView 上的 Alt-Drag 选择?

How Do I Disable Alt-Drag Selection on an NSTextView?

我不知道,也找不到当在 NSTextView 上按下 alt/option 按钮时拖动 select 功能的标准技术术语。

当按下 alt 时,十字准线出现并且文本可以是 selected/highlighted in columns/vertically,如 Xcode.

我想在我的 NSTextView 中禁用此功能,请问我该怎么做?

深入研究 AppKit 的反汇编很快就会发现一个钩子,它告诉 NSTextView 是否应该启用 ALT+拖动交互。这是名为 _allowsMultipleTextSelectionByMouse 的私有方法。改变它的行为就可以了,但它只能通过私有 API 来实现。在这种情况下,这样做应该是很安全的。

上述方法有以下两种修改方式:

方法一:NSUserDefaults

该方法在内部访问 NSUserDefaultsNSProhibitMultipleTextSelectionByMouse。您可以在应用程序级别控制此键的布尔值。这种方法的缺点是:

  • 您的应用程序的用户可能会重新启用它(例如,通过 defaults 命令行工具)。
  • 它会影响您应用中 NSTextView 的所有实例,甚至是那些您不一定想要更改的实例。

方法 2:调配

我决定采用的方法是在 NSTextView 的子 class 中对该方法进行简单调整。

internal final class MyTextView: NSTextView {

    internal static func initializeClass() {
        try? MyTextView.swizzle(
            Selector(("_allowsMultipleTextSelectionByMouse")),
            with: #selector(getter: swizzled_allowsMultipleTextSelectionByMouse)
        )
    }

    @objc dynamic internal var swizzled_allowsMultipleTextSelectionByMouse: Bool {
        return false
    }

}

在应用程序引导代码中的某处,例如 main 函数,您必须通过 MyTextView.initializeClass().

触发 class 初始化代码

上面的代码片段使用了我自己的 swizzling API 包装器,但肯定有一些库可以使用,或者您可以遵循 this article by PSPDFKit.

的建议