3

我已经覆盖- (void)keyDown:(NSEvent *)event了我的NSPanel子类。

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

如何确保它总是被调用?

4

1 回答 1

4

您确定需要为此捕获按键事件吗?

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 网站上有很多关于它的文档,例如这里的介绍。

于 2012-06-12T10:34:18.110 回答