收起键盘的方式通常有两种:辞去当前控件的第一响应者身份或者关闭父控件的可编辑状态。
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到新的页面->新页面键盘闪现键盘。
按照上述场景一的解决方案,在didSelectRowAtIndexPath:方法里[你的textField resignFirstResponder]即可。
//在没有耗时操作的情况下,这样做确实可行。(错误想法)
//本场景点击完地址cell会有一个耗时的逆地理反查的过程,这个时候上面的方法就不起作用了。(错误想法)
思考:在走didSelectRowAtIndexPath:方法时,对相应的textField做resign操作,可能是无效的。因为cell正在辞去自己的第一响应者身份,很有可能还没辞完,此时对并不是第一响应者的textField做resign操作自然是无效的。
解决办法:在弹框代码的上一句,[你的textField resignFirstResponder];
还有别的疑难场景的欢迎补充~