2

我有一个带有两个 NSButtons 和一个 NSTextField 以及几个视图和其他几个控件的窗口。我将左右箭头键分配给两个 NSButton 中的每一个。这两个按钮响应左右箭头键。但是,当在 NSTextField 中时,我希望箭头键像通常在文本字段中一样执行,而不是触发 NSButtons。我已尝试通读 Cocoa Key Handling 文档和其他有关关键事件的问题,但我找不到尝试在一个控件中更改关键等效行为的示例。我尝试对 NSTextField 进行子类化,但无法捕获箭头键。如何实施?

4

2 回答 2

2

您可以覆盖 becomeFirstResponder: 并在您的实现中调用 setKeyEquivalent:。如果要在按钮失去第一响应者状态时删除等效键,请覆盖 resignFirstResponder:。

在您希望影响按钮等效项的第一响应者状态的控件中执行此操作。例如,如果您有一个作为容器的视图并且它可以成为第一响应者,您将覆盖 -becomeFirstResponder:(调用 super)然后在那里管理按钮的等效项。如果您还不了解这些主题,那么您需要阅读大量的先决条件,因为这里无法给出简单的答案。

于 2012-11-14T05:40:57.623 回答
0

您可以像这样子类化NSButton和覆盖performKeyEquivalent:

override func performKeyEquivalent(event: NSEvent) -> Bool {
    guard
        let window = window where window.firstResponder.isKindOfClass(NSText.self) == false
    else {
        return false
    }

    return super.performKeyEquivalent(event)
}

如果第一响应者是文本字段/视图,这实质上会禁用等效键。

于 2016-07-11T07:45:43.293 回答