收起键盘的方式通常有两种:辞去当前控件的第一响应者身份或者关闭父控件的可编辑状态。

UITextField收起键盘的方法有:

在使用UITextField编辑的时候都会跟键盘打交道。

(模拟器打开键盘的快捷键是 command + k)

1、辞去当前控件的第一响应者身份

让textFiled放弃成为第一响应者(resignFirstResponder)

基本遇到的键盘收起有以下情况:

  • 让textFiled放弃成为第一响应者(resignFirstResponder)
  • 让view或者子view强制结束编辑状态(endEditing)

[textField resignFirstResponder];

让view或者子view强制结束编辑状态(endEditing)

1.点击 return 后收起键盘。

可以点击return收起键盘并不意味着弹出来的键盘一定都有return这个按键,比如数字键盘类型就没有,UIKeyboardTypeWebSearch类型的键盘return键就变成了Go键,需要注意的是这时候的Go键相当于return键。

要想实现点击return让键盘收起,首先需要设置textField代理,当然还有遵循UITextFieldDelegate协议:

_textField.delegate = self;

然后实现协议方法- (BOOL)textFieldShouldReturn:(UITextField
*)textField;,当然你也可以在这个方法里
main实现一些需求逻辑,比如判断输入的内容符不符合要求等。

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

2、关闭父控件的可编辑状态

1.输入完以后用户点击return后收起键盘。

2.点击背景后收起键盘

点击背景收起键盘可以实现view的- (void)touchesBegan:(NSSet<UITouch
*> *)touches withEvent:(UIEvent *)event方法,然后执行view的-
(BOOL)endEditing:(BOOL)force;方法。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES]; //实现该方法是需要注意view需要是继承UIControl而来的 }
还有一些比较笨的方法也可以实现达到点击背景后收起键盘的效果,比如:在背景view上面加手势,添加UIButton或者view,然后在对应的点击事件的监听方法中实现resignFirstResponder或者endEditing。

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(keyboardHide:)]; //设置成NO表示当前控件响应后会传播到其他控件上,默认为YES。 tapGestureRecognizer.cancelsTouchesInView = NO; //将触摸事件添加到view上 [self.view addGestureRecognizer:tapGestureRecognizer];

-(void)keyboardHide:(UITapGestureRecognizer*)tap{ [textFiled resignFirstResponder]; }

自己就先掌握这么多,感觉对于现阶段的我够用了,如果有更多以后会有添加。

[self.view endEditing:YES];

可以点击return收起键盘并不意味着弹出来的键盘一定都有return这个按键,比如数字键盘类型就没有,UIKeyboardTypeWebSearch类型的键盘return键就变成了Go键,需要注意的是这时候的Go键相当于return键。

第一种方式直接对相应的textField进行处理,适用于只有一个输入框、or明确知道要关闭哪个textField的输入状态的情况。

要想实现点击return让键盘收起,首先需要设置textField代理,当然还有遵循UITextFieldDelegate协议:

第二种方式简单粗暴,关闭当前view所有的编辑状态,堪称万精油。

_textField.delegate =self;

当拿不到父控件的时候,还有更暴力的方式:

然后实现协议方法- (BOOL)textFieldShouldReturn:(UITextField
*)textField;,当然你也可以在这个方法里
main实现一些需求逻辑,比如判断输入的内容符不符合要求等。

3、[[[UIApplication sharedApplication] keyWindow] endEditing:YES];


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

------------我是分割线------------

2.点击背景后收起键盘

以上只是常规的处理,通常当你用度娘或者google来寻找解决方案的时候,以上的方法肯定都尝试过了、并且毫无效果。

点击背景收起键盘可以实现view的- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event方法,然后执行view的-
(BOOL)endEditing:(BOOL)force;方法。

艸蛋场景一:

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{   
[self.view
endEditing:YES];//实现该方法是需要注意view需要是继承UIControl而来的}

订单支付页面,处于编辑状态->点击页面返回按钮->出现提示弹框->点完弹框,原本收起的键盘又会闪现一下,最后返回到上一页面。

还有一些比较笨的方法也可以实现达到点击背景后收起键盘的效果,比如:在背景view上面加手势,添加UIButton或者view,然后在对应的点击事件的监听方法中实现resignFirstResponder或者endEditing。

说了这么多,罪魁祸首就是那个弹框。

UITapGestureRecognizer*tapGestureRecognizer =
[[UITapGestureRecognizeralloc]
initWithTarget:selfaction:@selector(keyboardHide:)];//设置成NO表示当前控件响应后会传播到其他控件上,默认为YES。 
tapGestureRecognizer.cancelsTouchesInView
=NO;//将触摸事件添加到view上[self.view
addGestureRecognizer:tapGestureRecognizer];

在键盘的收起动画还没结束的时候,弹框弹了出来,抢走了textFiled的第一响应者身份。弹框消失后,textField又变回了第一响应者,继续执行键盘收起的动画。。。

-(void)keyboardHide:(UITapGestureRecognizer*)tap{      [textFiled
resignFirstResponder];  }

解决方案:在点击页面返回按钮的时候,在其点击事件首先将textFiled的第一响应者身份resign掉(或[self.view
endEditing:YES];)。这样当弹框成为又辞去第一响应者之后,textFiled也不会成为第一响应者。(通俗的讲,就是敌军已经杀到老家,为了避免被俘,赶紧自杀)。

3.不用view实现endEditing的方法

刚开始遇到这个问题的时候,网友给出的方案:

如果说在比较难获取viewController的view时,可以使用下面的方法:

有些情况不知道谁是第一响应者,可以先[textField
becomeFirstResponder];再[textField resignFirstResponder];

[[[UIApplicationsharedApplication] keyWindow] endEditing:YES];

艸蛋场景二:

或者

选择地址页面,在输入框输入地址->点击地址cell->出现提示弹框->点击弹框push到新的页面->新页面键盘闪现键盘。

[[UIApplicationsharedApplication]
sendAction:@selector(resignFirstResponder) to:nilfrom:nilforEvent:nil];

图片 1场景2

按照上述场景一的解决方案,在didSelectRowAtIndexPath:方法里[你的textField
resignFirstResponder]即可。

//在没有耗时操作的情况下,这样做确实可行。

//本场景点击完地址cell会有一个耗时的逆地理反查的过程,这个时候上面的方法就不起作用了。

思考:在走didSelectRowAtIndexPath:方法时,对相应的textField做resign操作,可能是无效的。因为cell正在辞去自己的第一响应者身份,很有可能还没辞完,此时对并不是第一响应者的textField做resign操作自然是无效的。

解决办法:在弹框代码的上一句,[你的textField
resignFirstResponder];

还有别的疑难场景的欢迎补充~

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注