如何禁用 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
该方法在内部访问 NSUserDefaults
的 NSProhibitMultipleTextSelectionByMouse
。您可以在应用程序级别控制此键的布尔值。这种方法的缺点是:
- 您的应用程序的用户可能会重新启用它(例如,通过
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.
的建议
我不知道,也找不到当在 NSTextView 上按下 alt/option 按钮时拖动 select 功能的标准技术术语。
当按下 alt 时,十字准线出现并且文本可以是 selected/highlighted in columns/vertically,如 Xcode.
我想在我的 NSTextView 中禁用此功能,请问我该怎么做?
深入研究 AppKit 的反汇编很快就会发现一个钩子,它告诉 NSTextView
是否应该启用 ALT+拖动交互。这是名为 _allowsMultipleTextSelectionByMouse
的私有方法。改变它的行为就可以了,但它只能通过私有 API 来实现。在这种情况下,这样做应该是很安全的。
上述方法有以下两种修改方式:
方法一:NSUserDefaults
该方法在内部访问 NSUserDefaults
的 NSProhibitMultipleTextSelectionByMouse
。您可以在应用程序级别控制此键的布尔值。这种方法的缺点是:
- 您的应用程序的用户可能会重新启用它(例如,通过
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()
.
上面的代码片段使用了我自己的 swizzling API 包装器,但肯定有一些库可以使用,或者您可以遵循 this article by PSPDFKit.
的建议