【问题标题】:How to intercept all key events sent to an editable NSTextField如何拦截发送到可编辑 NSTextField 的所有关键事件
【发布时间】:2021-04-12 17:49:17
【问题描述】:

我有一个隐藏的 NSTextField,我想在它是第一响应者时捕获发送给它的所有关键事件,并将这些关键事件重定向到另一个 NSView。我尝试了不同的方式来监听按键,但它们似乎都不能阻止 NSTextField 处理按键事件。

我这样做是出于可访问性的原因。我们有自己的自定义文本字段 UI。除非您使用真正的 NSTextField,否则似乎没有办法让语音将其视为文本字段。因此,我必须创建一个隐藏的 NSTextField 来与 macOS 交互并将关键事件发送到我们自己的自定义视图。

【问题讨论】:

  • 不它没有,在文本更改后调用 controlTextDidChange,我希望能够拦截和忽略键事件取决于按下的键。我实际上想出了如何做到这一点,我会尽快发布答案
  • 啊,是的,这基本上也是我找到的解决方案,它没有被赞成作为答案,我忽略了。感谢分享

标签: objective-c macos


【解决方案1】:

我自己想通了。

该解决方案并不完美,但它适合我的用例。诀窍是为 NSTextField 插入您自己的字段编辑器。

当 NSTextField 成为第一响应者时,NSWindow 将要求其委托返回一个自定义字段编辑器。您将需要实现NSWindowDelegate 选择器windowWillReturnFieldEditor。在此方法中,您可以将自己的 NSTextView 作为自定义字段编辑器返回(返回 nil 将使 NSWindow 使用默认字段编辑器)。实现NSWindowDelegate 后,您可以通过执行 myWindow.delegate = myCustomWindowDelegate 将其附加到您的窗口。

现在您的 NSTextField 将使用您的 NSTextView 作为其字段编辑器。要拦截关键事件,您只需要覆盖 NSTextView 中的 keyDown/keyUp 选择器来执行您自己的逻辑。这种方法的缺点是您无法访问字段编辑器的默认实现,您需要自行连接整个文本编辑逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2011-06-14
    • 2023-03-31
    • 1970-01-01
    • 2010-09-10
    • 2012-01-15
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多