NSTextField进入触发操作

Chr*_*ris 12 cocoa objective-c nstextfield

我一直在寻找一个简单的例子,说明当在文本字段中点击回车键时如何触发操作(或按钮).

我应该对文本字段进行子类化吗?我是否需要设置代理来调用我需要的操作?有没有办法在我的主窗口控制器类中捕获事件?

如果你甚至可以指出我正确的方向,这将是伟大的.谢谢.

Ada*_*dam 22

在接受答案的评论中引用的网站...现在由网站主机"暂停",并且Google缓存没有包含关键步骤的屏幕截图.

所以,这是我发现的另一种解决方案:

  1. 工作得很好
  2. 不需要子类化

对于某些键(Enter,Delete,Backspace等),Apple不会调用正常的controlTextDidEndEditing:etc方法.相反,Apple会为每个魔术键执行单独的选择器 - 但是有一种方法可以用来拦截它.

Apple的官方文档在这里:

https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextEditing/TextEditing.html#//apple_ref/doc/uid/TP40009459-CH3-SW31

...但是如果消失/被移动,请将此方法添加到您的委托中:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{           
    BOOL retval = NO;

    if (commandSelector == @selector(insertNewline:)) {

        retval = YES; // causes Apple to NOT fire the default enter action

        // Do your special handling of the "enter" key here

    }

    NSLog(@"Selector = %@", NSStringFromSelector( commandSelector ) );

    return retval;  
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我也想覆盖退格键 - 使用此方法运行应用程序,我得到输出说选择器是"deleteBackward:",所以我在那里添加了另一个if语句来对此作出反应.


Rav*_*ash 9

要在输入后执行操作,只需在窗口控制器中编写IBAction并连接到文本字段.如果你想要更多,那么当你专注于文本字段时应该调用你的方法,并留下你需要设置委托的文本字段(见这里).

  • 嗨,谢谢,我已经这样做了,但是如何过滤掉输入键,因为当它们从文本字段聚焦或模糊时,也会触发操作。谢谢 (2认同)
  • mojomonkeycoding.com网站现在已经死了,真是太遗憾了.最后,我找到了一种在代码中干净利落的方法 - 没有子类化 - 请参阅下面的答案. (2认同)