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

Swift UISearchController多字段搜索 输入空格后过滤失效

问题根因

原有过滤逻辑直接将包含空格的完整搜索词作为匹配串,单独和firstName、lastName字段做包含匹配:当用户输入带空格的内容(比如同时输入姓和名),单个字段不可能包含带空格的完整串,自然会出现过滤失效的问题。

修复实现

核心调整是将输入的搜索词按空白字符拆分为独立的搜索标记,过滤掉连续空格产生的空片段,再逐段校验匹配,修改后的代码如下:

func updateSearchResults(for searchController: UISearchController) {
    self.filteredPlayers = filteredPlayers(for: searchController.searchBar.text)
    applySnapshot(animatingDifferences: true)
}

func filteredPlayers(for queryOrNil: String?) -> [VTRPlayer] {
    let players = self.players
    guard let rawQuery = queryOrNil?
        .trimmingCharacters(in: .whitespacesAndNewlines)
        .lowercased(),
          !rawQuery.isEmpty else {
        return players
    }
    
    // 按空格拆分搜索词,过滤空片段(兼容连续多空格的输入场景)
    let searchTokens = rawQuery
        .components(separatedBy: .whitespaces)
        .filter { !$0.isEmpty }
    
    return players.filter { player in
        let lowerFirstName = player.firstName.lowercased()
        let lowerLastName = player.lastName.lowercased()
        
        // 所有搜索token都要在姓/名中匹配到才算命中
        return searchTokens.allSatisfy { token in
            lowerFirstName.contains(token) || lowerLastName.contains(token)
        }
    }
}
逻辑说明
  • 自动兼容无空格的单字段搜索:输入单个词时,拆分后只有一个token,逻辑和原有体验一致,可单独匹配姓或名
  • 支持带空格的组合搜索:比如输入"smith john",拆分后两个token会分别匹配,只要smith命中姓/名、john命中姓/名就会返回对应结果,不受输入顺序、空格数量影响
  • 自动忽略输入首尾空格、连续多空格的异常输入场景,不会出现无匹配结果的问题

如果需要严格匹配「姓+空格+名」/「名+空格+姓」的连续全名场景,可以在过滤逻辑里额外增加全名字段的匹配判断即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:42:29