我已经覆盖- (void)keyDown:(NSEvent *)event
了我的NSPanel
子类。
但是,仅当焦点不在NSTextField
我的面板内部时才会调用它。但是,无论焦点是在文本字段还是面板上,我都需要捕获“按下 Enter 按钮”事件。
如何确保它总是被调用?
我已经覆盖- (void)keyDown:(NSEvent *)event
了我的NSPanel
子类。
但是,仅当焦点不在NSTextField
我的面板内部时才会调用它。但是,无论焦点是在文本字段还是面板上,我都需要捕获“按下 Enter 按钮”事件。
如何确保它总是被调用?
您确定需要为此捕获按键事件吗?
Apple 在文档中声明,摆弄keyDown:
控件是最后的手段,只有当围绕代表的正常 Cocoa 架构不能满足您的要求时才使用。
如果目的是捕获按下的输入按钮,请注意文本字段中的此事件触发textDidEndEditing
委托方法(或通知,如果您愿意的话)。
因此,如果您controlTextDidEndEditing:
为您的委托实施,NSTextField
您应该能够对事件做出反应。当字段编辑器结束编辑时,会发送此通知(以及相关的委托方法)。
如果您希望提前一步捕获事件(在字段编辑器结束编辑之前),您可以实现委托方法,该方法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;
}
Apple 网站上有很多关于它的文档,例如这里的介绍。