Ios 从数组中搜索表
我刚刚开始学习swift,我正在学习tableview和searchbar功能。下面是我的数组,它是一个水果列表:Ios 从数组中搜索表,ios,swift,uitableview,uisearchbar,Ios,Swift,Uitableview,Uisearchbar,我刚刚开始学习swift,我正在学习tableview和searchbar功能。下面是我的数组,它是一个水果列表: var fruits: [[String]] = [["Apple", "Green"],["Pear", "Green"], ["Banana", "Yellow"], ["Orange", "Orange"]] 我把它们放在一个表格视图中,以水果的名称作为标题,颜色作为副标题。我正在尝试使用搜索栏进行筛选,但我似乎无法正确获得它。我只想搜索水果的名字,而不是颜色 var fi
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()
}
var filteredFruits=[String]()
var shouldShowSearchResults=false
func searchBar(searchBar:UISearchBar,textDidChange searchText:String){
filteredFruits.removeAll()
变量i=0
当我数的时候
{
var filteredFruits=fruits[i]。过滤器({(fruit:String)->Bool-in
return fruit.lowercased().range(of:searchText.lowercased())!=nil
})
如果搜索文本!“”
{
shouldShowSearchResults=true
如果filteredItems.count>0
{
filteredFruits.append(filteredItems[0])
filteredItems.removeAll()
}
}
其他的
{
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”)
产生[[“橙色”、“橙色”]]
如果要搜索所有属性,请使用以下内容:
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”)
产生[“苹果”、“绿色”]、[“梨”、“绿色”]、[“橙色”、“橙色”]
为了让您在未来走上正确的道路:您应该真正引入一个
Fruit
类,它保存一个特定Fruit实例的所有相关信息。然后,您可以使用第一个函数并执行类似于fruitObj.matches(searchText)
的操作,在Fruit
类中定义一个func
,该类确定水果是否与搜索匹配。我看到您的代码太复杂了,让一切保持简单
let 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()
if searchText.isEmpty {
// do something if searchText is empty
} else {
let arr = fruits.filter({ (fruit) -> Bool in
return fruit[0].lowercased().contains(searchText.lowercased())
})
filteredFruits = arr.map({ (fruit) -> String in // convert [[String]] -> [String]
return fruit[0]
})
}
self.tableView.reloadData()
}
我认为如果filteredFruits
的类型与fruits
的类型相同会更好。您可以像这样声明一个类型数组或元组,而不是[[String]]
,您可以像let fruits:[(名称:String,颜色:String)]=[(名称:“Apple”,颜色:“Green”)]
这个怎么样
var filteredFruits = fruits.filter ({ (fruitData: [String]) -> Bool in
let fruit = fruitData[0]
return fruit.lowercased().range(of: searchText.lowercased()) != nil
})