keyDown:(NSEvent *)事件在焦点位于文本字段上时不被调用



我已经覆盖了NSPanel子类中的- (void)keyDown:(NSEvent *)event

但是,仅当焦点不在面板内的NSTextField上时,才会调用它。但是,无论焦点是在文本字段还是面板上,我都需要捕获事件"按下输入按钮"。

如何确保它始终被调用?

您确定需要为此捕获键关闭事件吗?

Apple 在文档中指出,摆弄控件keyDown:是最后的手段,只有在代表周围的正常 Cocoa 架构不能按照您的意愿时才使用。

如果目的是捕获按下的 Enter 按钮,请注意,文本字段中的此事件会触发 textDidEndEditing 委托方法(或通知,如果您愿意的话)。

因此,如果您在NSTextField的委托中实现controlTextDidEndEditing:,您应该能够对事件做出反应。此通知(和相对委托方法)在字段编辑器结束编辑时发送。

如果您希望提前一步(在字段编辑器结束编辑之前)捕获事件,则可以实现委托方法control:textView:doCommandBySelector:该方法允许您截获特定键事件(例如返回键)并修改编辑器的行为。

示例如下:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
    BOOL retval = NO;
    if (commandSelector == @selector(insertNewline:)) {
        retval = YES; // Handled
        // Do stuff that needs to be done when newLine is pressed
    }
    return retval;
}

苹果网站上有很多关于它的文档,例如这里的介绍。

最新更新