我刚刚开始学习 swift,我正在研究 tableview 和 searchbar 功能。下面我有我的数组,它是水果列表:
var fruits: [[String]] = [["Apple", "Green"],["Pear", "Green"], ["Banana", "Yellow"], ["Orange", "Orange"]]
我将它们放在表格视图中,以水果的名称作为标题,以颜色作为副标题。我正在尝试使用搜索栏进行过滤,但我似乎无法正确处理。我只想搜索水果的名称而不是颜色。
var filteredFruits = [String]()
var shouldShowSearchResults = false
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredFruits.removeAll()
var i = 0
while i < fruits.count
{
var filteredFruits = fruits[i].filter ({ (fruit: String) -> Bool in
return fruit.lowercased().range(of: searchText.lowercased()) != nil
})
if searchText != ""
{
shouldShowSearchResults = true
if filteredItems.count > 0
{
filteredFruits.append(filteredItems[0])
filteredItems.removeAll()
}
}
else
{
shouldShowSearchResults = false
}
i += 1
}
self.tableView.reloadData()
}
我确实得到了返回的结果,但它混淆了字幕和标题,并且没有返回正确的结果。有人能指出我正确的方向吗?
我不明白为什么你使用某种 while 循环来迭代水果。相反,我建议您利用以下功能:
func filterFruits(searchText: String) -> [[String]] {
guard searchText != "" else {
return fruits
}
let needle = searchText.lowercased()
return fruits.filter {fruitObj in
return fruitObj.first!.lowercased().contains(needle)
}
}
该函数返回名称包含以下内容的所有水果searchText
.
filterFruits(searchText: "g")
yields [["Orange", "Orange"]]
如果您想搜索所有属性,请使用以下内容:
func filterFruits(searchText: String) -> [[String]] {
guard searchText != "" else {
return fruits
}
let needle = searchText.lowercased()
return fruits.filter {fruitObj in
return fruitObj.contains { attribute in
attribute.lowercased().contains(needle)
}
}
}
filterFruits(searchText: "g")
yields [["Apple", "Green"], ["Pear", "Green"], ["Orange", "Orange"]]
为了让你走上未来的正确轨道:你真的应该引入一个Fruit
包含一个特定水果实例的所有相关信息的类。然后你可以使用第一个函数并执行类似的操作fruitObj.matches(searchText)
在哪里定义一个func
在 - 的里面Fruit
确定水果是否与搜索匹配的类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)