UISearchDisplayController не перезагружает данные при поиске только по области

У меня есть 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 просто показывает все элементы, а не отфильтрованные.


person Francesco Frascà    schedule 07.11.2014    source источник


Ответы (2)


Функциональность UISearchDisplayController заключается в том, чтобы отображать searchResultsTableView только тогда, когда в строке поиска есть текст. Лучший способ обойти это, который я нашел, - создать свой собственный сегментированный контроллер для использования в качестве панели области видимости и отфильтровать фактический источник данных для вашего табличного представления по области, а затем отфильтровать его по тексту поиска при вводе строки поиска.

Извиняюсь!

person AnthonyMDev    schedule 01.12.2014

Я сделал это, перезагрузив табличное представление из метода делегата.

func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
    println("Scope Changed")
    updateSearchResultsForSearchController(searchController)
}

Эта последняя функция должна содержать код для сброса вашего фильтра/пересоздания массива/выборки всех объектов из основных данных (если это то, что вы делаете) И перезагрузки вашего tableView.

person monotreme    schedule 21.08.2015