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

Gil*_*les 2 cocoa nstextview

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

当按下 alt 时,会出现十字准线,并且可以在列中/垂直方向选择/突出显示文本,就像在 Xcode 中一样。

我想在我的 NSTextViews 中禁用这个功能,我该怎么做?

Luk*_*nek 5

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

有以下两种方法可以改变上述方法:

方法一: NSUserDefaults

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

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

方法 2:Swizzling

我决定采用的方法是在我的NSTextView.

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
    }

}
Run Code Online (Sandbox Code Playgroud)

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

上面的代码片段使用我自己的 swizzling API 包装器,但肯定有一些库可供使用,或者您可以遵循PSPDFKit 这篇文章中的建议