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
相关产品推荐
相关产品推荐

