最近,我在项目中遇到了这样的情况。
情景还原:
页面中有两个UITextField,其中textFieldA 需要点击弹出键盘,输入数据。因为要实时监听这个TextField的输入变化,所以我添加了
[_textFieldA addTarget:self action:@selector(textFieldDidChangeForA:) forControlEvents:UIControlEventEditingChanged];
另外textFieldB则需要点击有隐藏键盘,同时弹出actionSheet选择框,把选择的结果输入到TextField。为了方便管理,我同样添加了
[_textFieldB addTarget:self action:@selector(textFieldBeginEditingForB:) forControlEvents:UIControlEventEditingDidBegin];
然后在方法-(void)textFieldBeginEditingForB中,添加了代码[self.view endEditing:YES]; 等。
至此开始跑代码实际测试。
点击textFieldB,正确弹出actionSheet,键盘并没有弹起。
点击textFieldA,正确弹出键盘,并实时监听到数据输入。
问题出现在先点击textFieldA,然后点击textFieldB,这时候,键盘A并不会收起,挡住了actionSheet选择。并且再点击键盘A所有按钮,都失去任何效果。即使退出页面,这个“假”键盘依旧会显示在页面上。必须重新点击textFieldA,才能取消掉键盘。
经过多方修改尝试,发现问题出现在UIControlEventEditingDidBegin状态上。在点击切换textField过程中,会出现丢失焦点的问题,从而对当前页面的键盘,并不能正确处理。这个丢失是不可逆的。无论是
1.[_textFieldA resignFirstResponder];//单独设置textFieldA隐藏键盘
2.[self.view endEditing:NO];//重新获取焦点
[self.view endEditing:YES];//重新取消键盘
3.[[UIApplication sharedApplication].keyWindow endEditing:YES];//获取主页面去操作键盘
都没效果。
最后,
只能放弃[_textFieldB addTarget:self action:@selector(textFieldBeginEditingForB:) forControlEvents:UIControlEventEditingDidBegin];
使用_textFieldB.delegate = self;在delegate方法-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField里,单独对textFieldB判断,进而实现键盘A的收起操作。
事后总结:
1.检查问题应该仔细,发现问题根本所在。
2.当尝试过无法达到效果时,应果断更换实现功能的方法。