在NSTextField中按下Enter键时执行一个Action?

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

您可以通过设置文本字段的操作来完成此操作。 在IB中,将文本字段的select器连接到您的控制器或任何对象提供您要使用的IBAction。

要在代码中设置它,请向NSTextField发送一个setTarget:消息和一个setAction:消息。 例如,如果您在代码中将您的控制器对象设置为此,并且您的textFieldsockets被称为myTextField:

 - (void)someAction:(id)sender { // do something interesting when the user hits <enter> in the text field } // ... [myTextField setTarget:self]; [myTextField setAction:@selector(someAction:)]; 

你必须做到这一点

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

 self.textfield.delegate = self; 

然后实现这个方法

 - (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector { NSLog(@"Selector method is (%@)", NSStringFromSelector( commandSelector ) ); if (commandSelector == @selector(insertNewline:)) { //Do something against ENTER key } else if (commandSelector == @selector(deleteForward:)) { //Do something against DELETE key } else if (commandSelector == @selector(deleteBackward:)) { //Do something against BACKSPACE key } else if (commandSelector == @selector(insertTab:)) { //Do something against TAB key } // return YES if the action was handled; otherwise NO } 

在您的代理(NSTextFieldDelegate)中,添加以下内容:

 -(void)controlTextDidEndEditing:(NSNotification *)notification { // See if it was due to a return if ( [[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement ) { NSLog(@"Return was pressed!"); } } 

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

查找insertNewline:命令。

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

首先将您的ViewController子类化为:NSTextFieldDelegate

 class MainViewController: NSViewController, NSTextFieldDelegate { ... } 

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

 self.textField.delegate = self 

包含处理键盘响应者的NSTextFieldDelegate方法:

 func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool { if (commandSelector == #selector(NSResponder.insertNewline(_:))) { // Do something against ENTER key print("enter") return true } else if (commandSelector == #selector(NSResponder.deleteForward(_:))) { // Do something against DELETE key return true } else if (commandSelector == #selector(NSResponder.deleteBackward(_:))) { // Do something against BACKSPACE key return true } else if (commandSelector == #selector(NSResponder.insertTab(_:))) { // Do something against TAB key return true } else if (commandSelector == #selector(NSResponder.cancelOperation(_:))) { // Do something against ESCAPE key return true } // return true if the action was handled; otherwise false return false } 

在界面生成器中 – 点击你的NSTextField,进入连接编辑器,从select器拖动到你的控制器对象 – 你的动作应该出现!

这很容易,你可以直接从UI编辑器中完成

  1. 右键单击Text Feild,拖动Actionbutton,如下图所示

在这里输入图像说明

  1. 现在它会给你一些选项,如下面的屏幕截图所示,你需要select执行点击

在这里输入图像说明

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

在这里输入图像说明

注意:只要按下TabEnter键,事件就会立即生效。 如果你希望只有当用户按下Enter键时才会提出这个动作,那么你必须做一个设置。 转到“ Attribute inspector ,并将“ 操作”属性更改为 Send on Enter onlySend on Enter only ,如下面的屏幕截图所示

在这里输入图像说明

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

例如,定义一个方法:

 (void)setTextFieldString:(NSString *)addressString {} 

添加绑定:

 [textField bind:@"value" toObject:self withKeyPath:@"self.textFieldString" options:nil]; 

input任何文本并按回车键, setTextFieldString将被调用。