我已经覆盖了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;
}
苹果网站上有很多关于它的文档,例如这里的介绍。