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

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方面))