UITextField文本变更时字符计数异常及筛选数组错误求助
UITextField代理与TableView筛选问题修复
问题1:字符计数错误
textField(_:shouldChangeCharactersIn:replacementString:)是在文本即将变更时触发的,此时textField.text还是修改前的旧值,这就导致:
- 输入第一个字符时,旧text为空,count显示0
- 删除最后一个字符时,旧text长度为1,count显示1
问题2:筛选数组异常
由于筛选逻辑使用的是修改前的旧文本,当输入"2019"的最后一个字符"9"时,代码仍用旧文本"201"进行筛选,而"2018"和"2019"都包含"201",所以会同时显示两类条目。
修复方案
核心思路
先计算出文本修改后的真实内容,再基于这个内容做筛选和计数,同时优化筛选逻辑的严谨性。
修正后的代理方法代码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // 计算修改后的真实文本 guard let currentText = textField.text else { return true } let updatedText = (currentText as NSString).replacingCharacters(in: range, with: string) // 执行筛选逻辑 if updatedText.isEmpty { cardBoxItemsArrayFiltered.removeAll() } else { let searchQuery = updatedText.uppercased() cardBoxItemsArrayFiltered = cardBoxItemsArray.filter { item in item.searchedFor.uppercased().contains(searchQuery) } } // 打印正确的文本长度 print("TEXT COUNT: \(updatedText.count)") self.tableView.reloadData() return true }
关键修复点说明
- 真实文本计算:通过
NSString的replacingCharacters(in:with:)方法,精准得到修改后的文本内容,彻底解决计数错误和旧文本筛选的问题。 - 大小写统一:同时对搜索关键词和目标字段做大写转换,避免大小写敏感导致的匹配偏差。
- 简化筛选逻辑:用数组的
filter方法替代手动循环,代码更简洁高效,可读性更强。 - 空值处理:当搜索文本为空时直接清空筛选数组,匹配现有TableView的显示逻辑。
验证效果
- 输入第一个字符时,
updatedText.count会正确显示1 - 删除所有内容时,
updatedText.count显示0 - 输入"2019"时,只有包含"2019"的条目会被筛选出来,TableView显示正确内容
内容的提问来源于stack exchange,提问作者letsCode
相关产品推荐
相关产品推荐

