iOS收起键盘无效的几种解决方案

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

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

[textField resignFirstResponder];

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

[self.view endEditing:YES];

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

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

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

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

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

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

艸蛋场景一:

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

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

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

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

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

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

艸蛋场景二:

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

iOS收起键盘无效的几种解决方案_第1张图片
场景2

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

//在没有耗时操作的情况下,这样做确实可行。(错误想法)

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

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

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

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

你可能感兴趣的:(iOS收起键盘无效的几种解决方案)