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方法。
在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