【问题标题】:Override key equivalent for NSButton in NSTextField覆盖 NSTextField 中 NSButton 的等效键
【发布时间】:2012-11-14 04:59:36
【问题描述】:

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

【问题讨论】:

    标签: cocoa nstextfield nsbutton key-events


    【解决方案1】:

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

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

    【讨论】:

    • 是的,你的回答让我走上了正确的道路,而且我已经成功了。
    【解决方案2】:

    您可以继承 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)
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多