在NSTextField中按下Enter键时执行动作?


70

我现在有一个小问题。我想在NSTextField中按下Enter键时执行一种方法。用户应该能够输入他的数据,并且一旦按下回车键就应该执行一种计算方法。

Answers:


82

您可以通过设置文本字段的操作来做到这一点。在IB中,将文本字段的选择器连接到您的控制器或呈现您要使用的IBAction的任何对象。

要在代码中进行设置,请向NSTextField发送一条setTarget:消息和一条setAction:消息。例如,如果要在代码中的控制器对象上设置此属性,并且textField出口称为myTextField:


1
重要的是要注意,这在IB中不起作用(至少我不能使其起作用)。
StuFF mc

我第一次在Interface Builder上尝试此操作无效。无论出于什么原因。第二个奏效了。显然,始终在代码中工作。感谢您的指导!
StuFF mc 2011

6
除非我tab不在现场,否则它也会执行操作。
citelao

82
citelao:在现代XCode中,NSTextField可以具有不同的操作模式。默认情况下,NSTextField设置为“发送结束编辑”,无论何时出于任何原因停止编辑操作(例如,移开标签),该控件都会发送该操作。但是您可以在Interface Builder中将其切换为“仅在输入时发送”(在属性选项卡上,朝属性的“文本字段”组的底部),以使其仅在用户实际按下Enter时发送操作。
Trevor Powell

1
不幸的是,当您单击NSSearchField右侧的X时,它还会发送选择器。Apple的文档建议单击X等同于删除所有内容并键入enter,因此将调用选择器,以便您可以查找空的NSSearchField并清除结果。如果您不喜欢这种行为,我认为唯一的解决方法是添加类似于以下代码:[[[searchField cell] cancelButtonCell] setAction:@selector(clearSearchField :)]; [[[[searchField cell] cancelButtonCell] setTarget:self];
Winter Dragoness 2014年

50

您只需要这样做

对于某些键(Enter,Delete,Backspace等)

然后实现这个方法


3
另一个相关的命令cancelOperation:将由转义键触发。
Abhi Beckert

26

在您的委托(NSTextFieldDelegate)中,添加以下内容:


2
此代码适用于文本字段失去焦点的情况。不进入按钮
Gargo 2014年

不要忘记在代码/ IB中的.h中设置您的委托,并在IB中将文本字段操作修改为“仅在输入时发送”。
2014年

2
@Gargo至少在El Capitan上不是这样。按Enter键会导致收到此消息。导致它的是某种验证或其他原因。
Marek H

24

@ M.ShuaibImran的解决方案的Swift 3版本:

首先将ViewController子类化为:NSTextFieldDelegate

在viewDidLoad()中将textField委托分配给ViewController:

包括用于处理键盘响应程序的NSTextFieldDelegate方法:


谢谢你这个 只是我一直在寻找的小东西,近三年后,它仍然可以在Swift 5 / Xcode 11中运行,无需任何更改或Xcode建议。
艾格峰

14

这非常简单,您可以直接从UI编辑器中进行操作

  1. 右键单击Text Feild,将“操作引用”拖动到该按钮,如屏幕截图中所示。

在此处输入图片说明

  1. 现在,它将为您提供一些选项,如下图所示,您需要选择执行点击

在此处输入图片说明

  1. 现在看起来应该是这样

在此处输入图片说明

注意:只要按TabEnter键,就会引发该事件。如果您只希望在用户按下Enter键时才引发该动作,则必须进行设置。转到,Attribute inspector然后将Action属性更改为Send on Enter only,如下面的屏幕截图所示

在此处输入图片说明


1
嗨,这样做之后,当我按Enter键时,它是在文本字段中选择整个文本,如何停止呢?
souvickcse's

@Vikas Bansal,谢谢,您的解决方案对我有用。
Bilal Basharat

@souvickcse我遇到了完全相同的问题。您在这里找到任何解决方案了吗?这是3.5年后的事,但是……欢呼互联网:D
Aeger

老实说我忘记了这个问题本身,请尝试其他解决方案,我认为您的遗嘱问题将得到解决
souvickcse

是的...几天后,在调用该操作后,我找到了针对突出显示的文本的解决方案:只需将这三行放在最后:(let resultLength = String(result).count如果要计数的项目已经存在,那么String无需将其转换为String,然后添加这行:yourNSTextField.currentEditor()?.selectedRange = NSRange(location: resultLength, length: 0)然后是这一行:yourNSTextField.displayIfNeeded()光标将跳到显示内容的最后一个字符的后面
Aeger

4

NSTextFieldDelegate的-control:textView:doCommandBySelector:是你的朋友。

查找insertNewline:命令。


谢谢你 尽管我没有使用它(我setAction:在上面使用过),但我发现很多有用的东西在哪里insertNewline:
StuFF mc


1

最好的方法是将NSTextField值绑定到NSString属性。

例如,定义一个方法:

添加绑定:

输入任何文本,然后按回车键,setTextFieldString将被调用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.