美文网首页
iOS14 点击搜索表情键盘闪退(BlocksKit方面)

iOS14 点击搜索表情键盘闪退(BlocksKit方面)

作者: 楚风礼赞 | 来源:发表于2020-12-21 15:48 被阅读0次

    iOS 14 开始,系统的 emoji 键盘内部有一个搜索框 TUIEmojiSearchTextField

    图中的“搜索表情符号”就是本文提及的搜索框

        这个搜索框如果在 init 的时候设置 delegate(或者设置了keyboardAppearance 会导致触发死循环,目前我们并不需要为这个新的系统TF做代理,所以需要过滤掉它。

         我出错的位置是BlocksKit里面改用了“TUIEmojiSearchTextField”的delegate。BlocksKit会在把delegate变成block使用,非常方便,但是这里明显是转换了一个我们并不需要的delegate所以在BlocksKit获取delegate的地方过滤它。

         通过断点,我发现会有一个TUIEmojiSearchTextField的delegate在“bk_registerDynamicDelegateNamed:forProtocol:”方法中被调用,它主要功能就是修改 getter 和 setter 方法,将原有的 delegate 转发到 realDelegate,修改原有的 delegate 的实现。下图即是bk_registerDynamicDelegateNamed:forProtocol方法。

    图中为bk_registerDynamicDelegateNamed:forProtocol

    在setdelegate中,过滤掉TUIEmojiSearchTextField,加入如下代码

     if(@available(iOS13.0, *)) {            if([delegateisKindOfClass:NSClassFromString(@"TUIEmojiSearchTextField")]) {                delegate =nil;

               }

            }

    变成下面

    IMPsetterImplementation =imp_implementationWithBlock(^(NSObject*delegatingObject,iddelegate) {

    A2DynamicDelegate*dynamicDelegate =getDynamicDelegate(delegatingObject, protocol, infoAsPtr,YES);

    if([delegateisEqual:dynamicDelegate]) {

    delegate =nil;

    }

            if(@available(iOS13.0, *)) {

                if([delegateisKindOfClass:NSClassFromString(@"TUIEmojiSearchTextField")]) {

                    delegate =nil;

                }

            }

    dynamicDelegate.realDelegate= delegate;

    });

    即可。

    文章方法参考自腾讯的QMUI的1042问题:Tencent/QMUI_iOS/issues/1042

    相关文章

      网友评论

          本文标题:iOS14 点击搜索表情键盘闪退(BlocksKit方面)

          本文链接:https://www.haomeiwen.com/subject/lfmrnktx.html