You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

关键修复点说明

  1. 真实文本计算:通过NSString的replacingCharacters(in:with:)方法,精准得到修改后的文本内容,彻底解决计数错误和旧文本筛选的问题。
  2. 大小写统一:同时对搜索关键词和目标字段做大写转换,避免大小写敏感导致的匹配偏差。
  3. 简化筛选逻辑:用数组的filter方法替代手动循环,代码更简洁高效,可读性更强。
  4. 空值处理:当搜索文本为空时直接清空筛选数组,匹配现有TableView的显示逻辑。

验证效果

  • 输入第一个字符时,updatedText.count会正确显示1
  • 删除所有内容时,updatedText.count显示0
  • 输入"2019"时,只有包含"2019"的条目会被筛选出来,TableView显示正确内容

内容的提问来源于stack exchange,提问作者letsCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:15:13