在数组中使用范围栏(拆分视图)过滤搜索
Filtered Search with Scope Bar (Split View) in an Array
所以我有一个 Vegetable 对象,在其他属性中,有一个数组 foodArray 看起来像这样 ["Stew, "Salad"]
代表食物可以包含在什么食谱中 ["Eaten"]
如果蔬菜table 不再出现在储藏室中。例如:
let carrot = Vegetable(name: "carrot", foodArray: ["Stew"])
let tomato = Vegetable(name: "tomato", foodArray: ["Salad"])
let onion = Vegetable(name: "onion", foodArray: ["Stew", "Salad"])
let corn = Vegetable(name: "corn", foodArray: ["Eaten"])
并且所有这些 Vegetable 对象都将存储在名为 vegetables
.
的 Vegetable 数组中
我的问题是我是否可以使用此数组的值来设置过滤搜索。
我已经实现了 SplitView 并设置了搜索栏,并且有一个包含 Vegetable 对象列表的 table 视图。我希望范围栏具有在数组中找到的不同字符串(配方名称)。例如,"Stew"、"Salad"、"Eaten" 是范围按钮,当用户在范围按钮内搜索时,foodArray 中具有该按钮的所有 vegetable 对象会弹出。
目前,除了我的范围的实现之外,我的代码工作正常。这是我目前的代码:
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
filteredVegetables = vegetable.filter({( vegetable : Vegetable) -> Bool in
let categoryMatch = (scope == "All") || (vegetable.foodArray == scope)
return categoryMatch && vegetable.name.lowercased().contains(searchText.lowercased())
})
tableView.reloadData()
}
有人能告诉我如何修改此 filterContentForSearchText
函数以搜索数组并使范围按钮成为数组中不同的可能值(假设它们只是我上面列出的三个,即 "Eaten"、"Salad"、"Stew")?我想维护我的故事板拆分视图设置。感谢任何帮助。
您可以在 UISearchBarDelegate
方法中使用 contains
和 filter
searchBar(_:selectedScopeButtonIndexDidChange:)
。
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
let food: String
if selectedScope == 0 {
food = "Stew"
}
else if selectedScope == 1 {
food = "Salad"
}
else {
food = "Eaten"
}
filteredVegetables = vegetable.filter { [=10=].foodArray.contains(food) }
self.tableView.reloadData()
}
所以我有一个 Vegetable 对象,在其他属性中,有一个数组 foodArray 看起来像这样 ["Stew, "Salad"]
代表食物可以包含在什么食谱中 ["Eaten"]
如果蔬菜table 不再出现在储藏室中。例如:
let carrot = Vegetable(name: "carrot", foodArray: ["Stew"])
let tomato = Vegetable(name: "tomato", foodArray: ["Salad"])
let onion = Vegetable(name: "onion", foodArray: ["Stew", "Salad"])
let corn = Vegetable(name: "corn", foodArray: ["Eaten"])
并且所有这些 Vegetable 对象都将存储在名为 vegetables
.
我的问题是我是否可以使用此数组的值来设置过滤搜索。
我已经实现了 SplitView 并设置了搜索栏,并且有一个包含 Vegetable 对象列表的 table 视图。我希望范围栏具有在数组中找到的不同字符串(配方名称)。例如,"Stew"、"Salad"、"Eaten" 是范围按钮,当用户在范围按钮内搜索时,foodArray 中具有该按钮的所有 vegetable 对象会弹出。
目前,除了我的范围的实现之外,我的代码工作正常。这是我目前的代码:
func filterContentForSearchText(_ searchText: String, scope: String = "All") {
filteredVegetables = vegetable.filter({( vegetable : Vegetable) -> Bool in
let categoryMatch = (scope == "All") || (vegetable.foodArray == scope)
return categoryMatch && vegetable.name.lowercased().contains(searchText.lowercased())
})
tableView.reloadData()
}
有人能告诉我如何修改此 filterContentForSearchText
函数以搜索数组并使范围按钮成为数组中不同的可能值(假设它们只是我上面列出的三个,即 "Eaten"、"Salad"、"Stew")?我想维护我的故事板拆分视图设置。感谢任何帮助。
您可以在 UISearchBarDelegate
方法中使用 contains
和 filter
searchBar(_:selectedScopeButtonIndexDidChange:)
。
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
let food: String
if selectedScope == 0 {
food = "Stew"
}
else if selectedScope == 1 {
food = "Salad"
}
else {
food = "Eaten"
}
filteredVegetables = vegetable.filter { [=10=].foodArray.contains(food) }
self.tableView.reloadData()
}