如何在编辑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,谢谢。 你的代码工作。 只是为了明确(像新手一样),就像你说的,你必须设置UITextField
的delegate
等于文本字段所在的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的键盘:
- 我将ViewController中的UIView更改为UIControl。
-
我创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>
-
使委派不能到您的文本字段。
self.yourTextField.delegate = self;
-
将此方法添加到您的视图控制器。
– (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;