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

时间:2019-05-14 10:04:24

标签: cocoa nstextview

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

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

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

1 个答案:

答案 0 :(得分:0)

快速查看AppKit的反汇编,就会发现一个钩子,该钩子告诉return (kp.GetType() == typeof(RsaPrivateCrtKeyParameters)) ? MakePrivateRCSP(rsaKey, (RsaPrivateCrtKeyParameters)kp)) : MakePublicRCSP(rsaKey, (RsaKeyParameters)kp); 是否应启用ALT +拖动交互。这是称为NSTextView的私有方法。改变其行为可以解决问题,但只能通过私有API才能实现。在这种情况下,这样做应该很安全。

可以通过以下两种方式更改上述方法:

方法1:_allowsMultipleTextSelectionByMouse

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

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

方法2:令人毛骨悚然

我决定采用的方法是在NSTextView的子类中对该方法进行简单处理。

NSTextView

在诸如internal final class MyTextView: NSTextView { internal static func initializeClass() { try? MyTextView.swizzle( Selector(("_allowsMultipleTextSelectionByMouse")), with: #selector(getter: swizzled_allowsMultipleTextSelectionByMouse) ) } @objc internal var swizzled_allowsMultipleTextSelectionByMouse: Bool { return false } } 函数之类的应用程序自举代码中,您必须通过main触发类初始化代码。

上面的代码段使用了我自己的包装器来包装复杂的API,但是肯定有一些库可以使用,或者您可以按照this article by PSPDFKit的建议进行操作。