UISearchBar触发NSRangeException崩溃,求无需换组件的解决方案及touchesend捕获方法
UISearchBar崩溃临时解决方案
该问题属于iOS系统级UISearchBar内部逻辑缺陷,触发时内部文本选区范围计算错误导致越界抛出NSRangeException,无需更换组件的修复方案如下:
- 先通过KVC获取UISearchBar内置的输入框:
UITextField *searchField = [searchBar valueForKey:@"_searchField"]; - 实现
UITextFieldDelegate的textField:shouldChangeCharactersInRange:replacementString:方法,输入前先校验传入range的合法性:判断range.location + range.length <= searchField.text.length,如果不合法直接返回NO阻断本次输入,即可避免触发系统内部越界逻辑。 - 可额外添加全局异常兜底:针对UISearchBar所在业务线程抛出的
NSRangeException做捕获处理,避免未覆盖到的场景直接崩溃。
捕获touchesEnd事件的实现方案
UITextFieldDelegate本身不提供触摸结束事件的回调,可通过两种方式实现监听:
- 子类化UITextField,重写
touchesEnded:withEvent:方法,在方法中加入你需要的排查逻辑,再将自定义的子类实例通过KVC赋值给UISearchBar的_searchField属性即可。 - 给UITextField添加分类,通过Runtime方法交换机制hook
touchesEnded:withEvent:的实现,插入自定义监听逻辑,注意添加过滤条件:只有当前输入框属于UISearchBar的内置控件时才执行你的排查逻辑,避免影响全局其他输入组件。
内容的提问来源于stack exchange,提问作者super_friend
相关产品推荐
相关产品推荐

