如何在编辑UITextField时closures键盘

我知道我需要告诉我的UITextField在我想要拒绝键盘时退出第一响应者,但我不知道如何知道用户何时按下了键盘上的“完成”键。 有没有可以注意的通知?

我将UITextField的委托设置为我的ViewController类。

在这个类中,我实现了这个方法如下:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return NO; } 

如果将文本字段的DidEndOnExit事件连接到InterfaceBuilder中的操作(IBAction),则当用户解除键盘(使用返回键)时,将会发送消息,发件人将成为引发事件的UITextField的引用。

例如:

 -(IBAction)userDoneEnteringText:(id)sender { UITextField theField = (UITextField*)sender; // do whatever you want with this text field } 

然后,在InterfaceBuilder中,将文本字段的DidEndOnExit事件链接到控制器上的此操作(或者用于链接UI中的事件的任何内容)。 每当用户input文本并解散文本字段时,控制器将发送此消息。

您也可以在您的控制器中创build一个方法

  -(IBAction)editingEnded:(id)sender{ [sender resignFirstResponder]; } 

然后在IB的Connection Inspector中将事件“Did End On Exit”连接到它。

kubi,谢谢。 你的代码工作。 只是为了明确(像新手一样),就像你说的,你必须设置UITextFielddelegate等于文本字段所在的ViewController。 无论你在哪里,你都可以做到这一点。 我select了viewDidLoad方法。

 - (void)viewDidLoad { // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done daTextField.delegate = self; } 

这是一个窍门,让自动键盘解除行为没有代码。 在nib中,编辑Identity inspector中的First Responder代理对象,添加新的第一响应者操作; 我们把它叫做dummy: 。 现在将文本字段的Did End on Exit事件挂接到First Responder代理对象的dummy: action。 而已! 由于文本字段的“退出结束”事件现在具有动作 – 目标对,因此当用户点击返回时,文本字段会自动closures其键盘。 并且由于没有为发送响应者链的消息find处理程序而没有惩罚,所以即使没有实现dummy:任何地方,应用程序也不会崩溃。

只需添加

 [textField endEditing:YES]; 

您要在哪里停用键盘并显示选取器视图。

在Swift中,您可以在Controller中编写一个IBAction,并将文本字段的Did End On事件设置为该操作

 @IBAction func returnPressed(sender: UITextField) { self.view.endEditing(true) } 

你也可以使用

  - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.yourTextField resignFirstResponder]; } 

最好的一个,如果你有很多Uitextfields:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 

以下是我必须做的工作,我认为对于有键盘的数字键盘(或任何其他没有完成button的键盘:

  1. 我将ViewController中的UIView更改为UIControl。
  2. 我创build了一个叫做的函数

     -(IBAction)backgroundIsTapped:(id)sender 

这也是在.h文件中定义的。

在此之后,我链接到了Interface Builder中ViewController的'touch down'位。

在“背景是挖掘”function,我把这个:

  [answerField resignFirstResponder]; 

只要记住将“answerField”更改为您要删除键盘的UITextField的名称(显然请确保您的UITextField是像下面那样定义的:)

  IBOutlet UITextField * <nameoftextfieldhere>; 

我知道这个话题可能在很久以前就已经死了,但是我希望这会帮助别人!

您会注意到,“textFieldShouldReturn”方法提供了已经击中了DONE键的文本字段对象。 如果您设置标签,您可以打开该文本字段。 或者您可以跟踪和比较对象的指针与其创build者存储的某个成员值。

我的做法是这样的自学:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { NSLog(@"%s", __FUNCTION__); bool fDidResign = [textField resignFirstResponder]; NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not "); return fDidResign; } 

与此同时,我把拒绝辞职的“validation”testing。 这只是为了说明,所以如果用户inputNO! 进入领域,它不会解雇。 行为是我想要的,但是输出的顺序并不像我预期的那样。

 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { NSLog(@"%s", __FUNCTION__); if( [[textField text] isEqualToString:@"NO!"] ) { NSLog(@"%@", textField.text); return NO; } else { return YES; } } 

以下是我的NSLog输出这个拒绝之后接受。 您会注意到我正在返回辞职的结果,但我希望它返回FALSE给我回报给调用者?! 除此之外,它有必要的行为。

 13.313 StudyKbd [109:207]  -  [StudyKbdViewController textFieldShouldReturn:]
 13.320 StudyKbd [109:207]  -  [StudyKbdViewController textFieldShouldEndEditing:]
 13.327 StudyKbd [109:207]不!
 13.333 StudyKbd [109:207]  -  [StudyKbdViewController textFieldShouldReturn:]:确实退出键盘
 59.891 StudyKbd [109:207]  -  [StudyKbdViewController textFieldShouldReturn:]
 59.897 StudyKbd [109:207]  -  [StudyKbdViewController textFieldShouldEndEditing:]
 59.917 StudyKbd [109:207]  -  [StudyKbdViewController doneEditText]:NO
 59.928 StudyKbd [109:207]  -  [StudyKbdViewController textFieldShouldReturn:]:确实退出键盘

这是一个相当干净的方式来结束与返回键或在后台触摸版。

在“界面”构build器中,将您的字段embedded到类UIFormView的视图中

这课是什么:

  • 将自己自动附加为字段委托(可以从nib中唤醒,或手动添加)
  • 在当前编辑的字段上保留一个参考
  • 退回键盘或在后台触摸

这里是代码:

接口

 #import <UIKit/UIKit.h> @interface UIFormView : UIView<UITextFieldDelegate> -(BOOL)textFieldValueIsValid:(UITextField*)textField; -(void)endEdit; @end 

履行

 #import "UIFormView.h" @implementation UIFormView { UITextField* currentEditingTextField; } // Automatically register fields -(void)addSubview:(UIView *)view { [super addSubview:view]; if ([view isKindOfClass:[UITextField class]]) { if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self]; } } // UITextField Protocol -(void)textFieldDidBeginEditing:(UITextField *)textField { currentEditingTextField = textField; } -(void)textFieldDidEndEditing:(UITextField *)textField { currentEditingTextField = NULL; } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self endEdit]; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { if ([self textFieldValueIsValid:textField]) { [self endEdit]; return YES; } else { return NO; } } // Own functions -(void)endEdit { if (currentEditingTextField) { [currentEditingTextField endEditing:YES]; currentEditingTextField = NULL; } } // Override this in your subclass to handle eventual values that may prevent validation. -(BOOL)textFieldValueIsValid:(UITextField*)textField { return YES; } @end 
  • 通过子类化表单并覆盖textFieldValueIsValid:方法,如果给定字段的值不正确,则可以避免版本结束。

  • 如果一个字段在Interface Builder中设置了一个委托,那么这个表单不会改变它。 我没有看到有很多理由来为某个领域设置不同的代表,但为什么不呢?

有很多方法来改善这个窗体视图类 – 附加一个委托,做一些布局,当键盘覆盖一个字段(使用currentEditingTextField框架)处理,自动启动下一个领域的版本,…

我个人保留在我的框架中,并且总是为它添加子类以增加function,但是“按原样”通常是有用的。

我希望这会有所帮助。 欢呼声

如果你想在UIViewController中进行所有的编辑,你可以使用。

 [[self view]endEditing:YES]; 

如果你想解散一个微妙的UITextField键盘隐藏然后使用。

1.在您的viewcontroller.h中添加委托

 <UITextFieldDelegate> 
  1. 使委派不能到您的文本字段。

    self.yourTextField.delegate = self;

  2. 将此方法添加到您的视图控制器。

    – (BOOL)textFieldShouldEndEditing:(UITextField *)textField {[textField resignFirstResponder]; 返回YES;}

创build一个functionhidekeyboard并将其链接到.xib文件中的文本框,然后selectDidEndOnExit

 -(IBAction)Hidekeyboard { textfield_name.resignFirstResponder; } 

如果您使用Interface Builder创build了视图,请使用以下方法只需创build一个方法,

 -(IBAction)dismissKeyboard:(id)sender { [sender resignFirstResponder]; } 

只需右键单击视图中的文本字段,并将事件设置为在退出时结束,并将其连接到方法“dismissKeyboard”。

对于初学者来说,最好的指南是“Head First iPhone和iPad Development,2nd Edition”

尝试这个

 - (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text { if ([text isEqualToString:@"\n"]) { [textView resignFirstResponder]; return NO; } return YES; } 
 //==================================================== // textFieldShouldReturn: //==================================================== -(BOOL) textFieldShouldReturn:(UITextField*) textField { [textField resignFirstResponder]; if(textField.returnKeyType != UIReturnKeyDone){ [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder]; } return YES; } 

任何人都在寻找Swift 3

1)确保你的UITextField的委托连线到你的ViewController的故事板

2)在你的ViewController.Swift文件中实现UITextFieldDelegate (例如类ViewController:UIViewController,UITextFieldDelegate {)

3)使用下面的委托方法

 func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() return false } 

Swift 3,iOS 9+

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

 textField.returnKeyType = UIReturnKeyDone;