【问题标题】:Filtered Search with Scope Bar (Split View) in an Array在数组中使用范围栏(拆分视图)过滤搜索
【发布时间】:2017-02-15 05:34:32
【问题描述】:

所以我有一个蔬菜对象,在其他属性中,有一个数组 foodArray,看起来像这样 ["Stew, "Salad"] 表示食物可以包含在哪个食谱中,如果在食品储藏室中不再找到蔬菜,["Eaten"] .比如:

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"])

所有这些蔬菜对象都将存储在一个名为 vegetables 的蔬菜数组中。

我的问题是我是否可以使用这个数组的值来设置过滤搜索。

我已经实现了 SplitView 并设置了搜索栏,并有一个带有蔬菜对象列表的表格视图。我希望范围栏具有在数组中找到的不同字符串(配方名称)。例如,“Stew”、“Salad”、“Eaten”作为范围按钮,当用户在范围按钮内搜索时,foodArray 中所有具有该按钮的蔬菜对象都会弹出。

目前,我的代码工作正常,除了我的范围的实现。这是我到目前为止的代码:

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”,“沙拉”、“炖菜”)?我想维护我的故事板拆分视图设置。任何帮助表示赞赏。

【问题讨论】:

    标签: ios arrays swift scope uisearchbar


    【解决方案1】:

    您可以在UISearchBarDelegate 方法searchBar(_:selectedScopeButtonIndexDidChange:) 中使用containsfilter

    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 { $0.foodArray.contains(food) }
         self.tableView.reloadData()
    }
    

    【讨论】:

    • 谢谢!是否可以将两个值组合到一个范围中?例如,如果我想要两个范围按钮:“Eaten”和“Recipe”,其中“Recipe”包含“Stew”和“Salad”?
    • 是的,就是这样。
    • @ch1maera 对于Eaten 过滤器与我当前对Recipe 的解决方案相同,您可以通过这种方式过滤您的数组。 filteredVegetables = vegetable.filter { $0.foodArray.contains("Stew") || $0.foodArray.contains("Salad") }
    • 谢谢!因为现在有两个filteredVegetables 变量,它们会放在if/else 语句中吗?
    • 知道了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多