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

时间:2012-06-12 10:20:33

标签: objective-c cocoa

我在- (void)keyDown:(NSEvent *)event子类中重写了NSPanel

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

如何确保始终调用它?

1 个答案:

答案 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