Objective c 当焦点位于文本字段上时,不会调用keyDown:(NSEvent*)事件

Objective c 当焦点位于文本字段上时,不会调用keyDown:(NSEvent*)事件,objective-c,cocoa,Objective C,Cocoa,我已经在我的NSPanel子类中重写了-(void)keyDown:(NSEvent*)事件 但是,仅当焦点不在我的面板内的NSTextField上时,才会调用它。 但是,我需要捕捉事件“按下Enter按钮”,无论焦点是在文本字段还是面板上 如何确保它始终被调用?您确定需要捕获该事件的按键关闭事件吗 苹果在文档中表示,在控件上摆弄按键:是最后的手段,只有在代理周围的普通Cocoa架构不能满足您的需要时才使用 如果目的是捕捉按下的enter按钮,请注意文本字段中的此事件会触发textdidedit

我已经在我的
NSPanel
子类中重写了
-(void)keyDown:(NSEvent*)事件

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


如何确保它始终被调用?

您确定需要捕获该事件的按键关闭事件吗

苹果在文档中表示,在控件上摆弄
按键:
是最后的手段,只有在代理周围的普通Cocoa架构不能满足您的需要时才使用

如果目的是捕捉按下的enter按钮,请注意文本字段中的此事件会触发
textdidediting
delegate方法(或通知,如果您愿意)

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

如果希望提前一步捕获事件(在字段编辑器结束编辑之前),可以实现委托方法
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;
}
苹果网站上有很多关于它的文档,比如介绍