Cocoa 如何在NSTextView上禁用Alt拖动选择?

Cocoa 如何在NSTextView上禁用Alt拖动选择?,cocoa,nstextview,Cocoa,Nstextview,当在NSTextView上按下alt/option按钮时,我不知道也找不到拖动选择功能的标准技术术语 当按下alt时,十字线出现,文本可以在列/垂直方向上选择/突出显示,如在Xcode中 我想在我的NSTextViews中禁用此功能,请问如何才能做到这一点?深入分析AppKit的反汇编过程会很快发现一个钩子,它告诉NSTextView是否应该启用ALT+drag交互。这是一个名为_allowsMultipleTextSelectionByMouse的私有方法。改变它的行为可以做到这一点,但只有通

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

当按下alt时,十字线出现,文本可以在列/垂直方向上选择/突出显示,如在Xcode中


我想在我的NSTextViews中禁用此功能,请问如何才能做到这一点?

深入分析AppKit的反汇编过程会很快发现一个钩子,它告诉NSTextView是否应该启用ALT+drag交互。这是一个名为_allowsMultipleTextSelectionByMouse的私有方法。改变它的行为可以做到这一点,但只有通过私有API才能实现。在这种情况下,这样做应该是相当安全的

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

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

应用程序的用户可以重新启用它,例如通过默认命令行工具。 它会影响应用程序中NSTextView的所有实例,即使是您不一定要更改的实例。 方法2:旋转 我决定采用的方法是在我的NSTextView子类中简单地使用这个方法

内部最终类MyTextView:NSTextView{ 内部静态函数初始化类{ 试试?MyTextView.swizzle 选择器\通过鼠标允许MultipleTextSelectionBy, 使用:selectorgetter:swizzled\u允许通过鼠标进行多重选择 } @objc动态内部变量swizzled_允许MultipleTextSelectionByMouse:Bool{ 返回错误 } } 在应用程序引导代码的某个地方,比如主函数,您必须通过MyTextView.initializeClass触发类初始化代码


上面的代码片段使用了我自己的swizzling API包装器,但是肯定有一些库可以使用,或者您可以遵循其中的建议。

是您希望将选择限制为单行还是您真的不希望出现十字光标?试图找出满足您需求的最佳实现方式:我认为列选择仅适用于固定宽度字体,而我不使用固定宽度字体。多个零件选择的cmd拖动选择可以。绝对没有十字线!回答得好!非常感谢。