У меня есть UITableViewController, который использует простой SearchBar для фильтрации результатов. Я использую массив конфет с именем и категорией, и я использую эти категории в качестве параметров для панели области видимости моего SearchBar. У меня есть служебная функция для применения фильтра:
func filterContentForSearchText(searchText: String, scope: String = "All") {
// Filter the array using the filter method
self.filteredCandies = self.candies.filter(){( candy: Candy) -> Bool in
let categoryMatch = (scope == "All") || (candy.category == scope)
let stringMatch = candy.name.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
return categoryMatch && (stringMatch != nil)
}
}
Я вызываю эту функцию в методе searchDisplayController:shouldReloadTableForSearchScope: и в методе searchDisplayController:shouldReloadTableForSearchString:.
Если я помещаю какой-либо текст в SearchBar, все работает, даже когда я выбираю область действия на панели области видимости. Проблема в том, что когда я очищаю текст (или когда я выбираю область без текста), фильтр не применяется. С некоторой отладкой я увидел, что массив хорошо фильтруется при вызове tableView:cellForRowAtIndexPath:, но tableView просто показывает все элементы, а не отфильтрованные.