我在过滤数组时遇到了一些麻烦。
我有这段代码:
var names = [Name]()
var filteredNames = [Name]()
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == nil || searchBar.text == ""{
inSearchMode = false
collectionView.reloadData()
view.endEditing(true)
} else {
inSearchMode = true
let lower = searchBar.text!.lowercased()
print(lower)
filteredNames = names.filter({$0.name.range(of: lower) != nil})
collectionView.reloadData()
}
}
问题是似乎没有正确看到字母。 我在控制台上打印了名称Array,filetredNames数组和searchBar.text,结果如下:
怎么可能" Discus"键入d时不包括值? 它发生在所有字母上(例如,铁饼返回零结果等)
谢谢
答案 0 :(得分:1)
问题
您已将searchText更改为小写,但您的数据源(名称)包含大写字母。
修复
变化:
$0.name.range(of: lower)
到:
$0.name.lowercased().range(of: lower)
答案 1 :(得分:1)
使用name
搜索字符串时,您需要小写搜索文本和.range(of:
属性。
答案 2 :(得分:1)
问题是您只搜索搜索栏输入的小写版本。
您应该使用localizedCaseInsensitiveContains
作为filter
条件。
names.filter{$0.localizedCaseInsensitiveContains(searchBar.text!)}
这样你就不必手动分别处理大写/小写,两者都会自动由函数处理。