iOS之becomeFirstResponder方法的坑
2019-12-16 本文已影响0人
枫叶无处漂泊
前言
产品提出的需求,让登录和注册在同一个页面,登录和注册两个按钮切换。所以每当切换的时候都要键盘没收回的话,要收键盘。
当时做的处理使用becomeFirstResponder这个方法,在模拟器上Mac硬件配置高没事,但是在真机上出现卡顿,说明这becomeFirstResponder特别费时。
becomeFirstResponder 让view变成第一响应对象
所以当时我就做了收回键盘的处理,就是判断键盘变成第一响应对象,如果变成键盘收回。举个例子可以测试一下:
//收回键盘
- (void)resignAllKeyboards {
if ([self.telInputView becomeFirstResponder]) {
[self.telInputView resignFirstResponder];
return;
}
if ([self.pswInputView becomeFirstResponder]) {
[self.pswInputView resignFirstResponder];
return;
}
if ([self.identifyView.inputView becomeFirstResponder]) {
[self.identifyView.inputView resignFirstResponder];
return;
}
if ([self.identifyTelView.inputView becomeFirstResponder]) {
[self.identifyTelView.inputView resignFirstResponder];
return;
}
}
直接结果表明,每当执行到这个[self.telInputView becomeFirstResponder]就会出现卡顿。所以尽量不要使用becomeFirstResponder这种费时的方法,及时使用了也要测试一下是否影响性能。
键盘收回的话不用做判断或者先用isFirstResponder是否是第一响应者
//收回键盘
- (void)resignAllKeyboards {
//让所有的文本输入空间都收回键盘。
if ([self.telInputView isFirstResponder]) {
[self.telInputView resignFirstResponder];
return;
}
if ([self.pswInputView isFirstResponder]) {
[self.pswInputView resignFirstResponder];
return;
}
if ([self.identifyView.inputView isFirstResponder]) {
[self.identifyView.inputView resignFirstResponder];
return;
}
if ([self.identifyTelView.inputView isFirstResponder]) {
[self.identifyTelView.inputView resignFirstResponder];
return;
}
使用之后,发现真机切换操作流程非常快。
结尾
所以resignFirstResponder就是这个罪魁祸首。所以以后大家使用resignFirstResponder这个方法一定要慎重,多测试一下性能。避免不必要的性能壁垒。