我在- (void)keyDown:(NSEvent *)event
子类中重写了NSPanel
。
但是,仅当焦点不在我面板内的NSTextField
时才会调用它。
但是,我需要捕捉事件“按下Enter按钮”,无论焦点是在文本字段还是面板上。
如何确保始终调用它?
答案 0 :(得分:4)
你确定你需要抓住关键事件吗?
苹果公司在调整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网站上有很多关于它的文档,例如介绍here。