关于UITextField切换系统键盘和InputView的卡顿的问题

想到很多读者都是来找解决方法的,所以我先把解决方法写出来:

原写法:
<span style="white-space:pre">	</span>[self.textInputTextField resignFirstResponder];
        
        self.textInputTextField.inputView = inputView;
        
        [self.textInputTextField becomeFirstResponder];
解决办法:
<span style="white-space:pre">	</span>self.textInputTextField.inputView = inputView;
        
        [self.textInputTextField reloadInputViews];
结论:
reloadInputViews去替代resignFirstResponder和becomeFirstResponder两个方法的组合,可以解决切换系统和自定义键盘时产生的卡顿

但是为什么用resignFirstResponder和becomeFirstResponder会卡顿,不懂底层,所以想不到该怎么解释,如果读者有人知道,还请留下您的看法啊!!

--------------------------------------------------------------开始详细的BB叨-------------------------------------------------------------------------

    接手外包公司做的第一版项目,IM部分用的10s循环访问服务器获取最新消息.看的我和经理感觉后背发凉.又因为公司其他项目也用到IM,所以我们打算自己写一个(功能很简单的IM).
我们IM的界面和逻辑大致参考微信去做,当然比微信的功能少很多,只是满足简单的交流需求.
表情键盘和语音消息、图片和发小视频这些功能是必不可少的,所以在界面中就需要切换键盘,那么,下面问题就来了

我的实现思路大概就是先"辞去当前TextField的第一响应者"->设置TextField的inputView->"当前TextField成为第一响应者"来展现自定义的View,然后再点击按钮的时候判断按钮的selected状态,"辞去当前TextField的第一响应者"->设置TextField的inputView = nil->"当前TextField成为第一响应者"来切换回系统键盘.代码如下
 if (sender.selected == NO) {
        
        [self.textInputTextField resignFirstResponder];
        
        self.textInputTextField.inputView = inputView;
        
        [self.textInputTextField becomeFirstResponder];
        
        sender.selected = YES;
        
    }else{
     
<pre name="code" class="objc">        [self.textInputTextField resignFirstResponder];
        
        self.textInputTextField.inputView = nil;
        
        [self.textInputTextField becomeFirstResponder];
sender.selected = NO; }
 
 然后在真机上运行,忽然发现卡爆了,大概有0.5秒的卡顿...短短几行简单无比的代码能卡顿这么久,不能忍...于是乎找到底卡顿是哪句代码产生的,于是想到用" 
 CACurrentMediaTime()",代码如下 
 
<span style="white-space:pre">	</span>NSTimeInterval start = CACurrentMediaTime();
        
        [self.textInputTextField resignFirstResponder];
        
        NSLog(@"%f",CACurrentMediaTime() - start);
        
        start = CACurrentMediaTime();
        
        self.textInputTextField.inputView = inputView;
        
        NSLog(@"%f",CACurrentMediaTime() - start);
        
        start = CACurrentMediaTime();

        
        [self.textInputTextField becomeFirstResponder];
        
        NSLog(@"%f",CACurrentMediaTime() - start);
        
        sender.selected = YES;
        发现耗时最多的就是resignFirstResponder和becomeFirstResponder两个方法,但是从打印时间间隔来看,程序启动第一次呼出自定义键盘的时候,整个方法执行下来大概是0.5秒左右,可以理解,毕竟需要初始化view,后续再调用这个方法,整体时间间隔大概就是0.2秒左右.但是卡顿给我的感觉大概得有0.5秒左右.
   然后在网上搜"inputView切换卡顿",发现好像没人遇到这个问题啊,难道我人品爆炸了?
   无意中发现一位网友用了reloadInputViews这个方法,怀着尝试的心态试一下,我靠,好多了,很开心.但是具体的为什么会那么卡,不懂底层,找不到实质性原因,如有大神看到该贴,还请指教.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值