2017-02-15 18 views
0

Итак, у меня есть объект Vegetable, который среди других свойств имеет массив foodArray, который выглядит примерно так: ["Stew, "Salad"], представляющий, в каком рецепте может быть включен пищевой продукт, и ["Eaten"], если овощ больше не содержится в кладовой. Так, например:Filtered Search with Scope Bar (Split View) в массиве

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 функции поиск через массив и иметь кнопки Scope быть различными возможными значениями в массиве (при условии, что они являются только три перечисленные выше, т.е. «Ешьте», «Салат», «Тушеное мясо»)? Я хочу сохранить мою раскладку раскадровки. Любая помощь приветствуется.

ответ

1

Вы можете использовать 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 { $0.foodArray.contains(food) } 
    self.tableView.reloadData() 
} 
+0

Спасибо! Можно ли объединить два значения в одну область? Например, если мне нужны две кнопки сферы: «Ешьте» и «Рецепт», где «Рецепт» содержит «Тушеное мясо» и «Салат»? – ch1maera

+0

Да, вот и все. – ch1maera

+0

@ ch1maera Для этого фильтра «Eaten» это то же самое, что и мое текущее решение для 'Recipe', вы можете фильтровать ваш массив таким образом. 'filtersVegetables = vegetable.filter {$ 0.foodArray.contains (" Stew ") || $ 0.foodArray.contains («Салат»)} ' –

 Смежные вопросы

  • Нет связанных вопросов^_^