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这个方法一定要慎重,多测试一下性能。避免不必要的性能壁垒。

上一篇下一篇

猜你喜欢

热点阅读