仅在按范围搜索时,UISearchDisplayController不会重新加载数据

时间:2014-11-07 16:26:51

标签: xcode swift ios8 uisearchdisplaycontroller searchbar

我有一个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只显示所有元素,而不是过滤后的元素。

2 个答案:

答案 0 :(得分:1)

UISearchDisplayController的功能是仅在搜索栏中有文字时显示searchResultsTableView。我找到的解决此问题的最佳方法是创建自己的分段控制器以用作范围栏,并按范围过滤表视图的实际数据源,然后在输入搜索字符串时按搜索文本对其进行过滤。

抱歉!

答案 1 :(得分:0)

我通过从委托方法重新加载我的tableview来实现这一点。

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

最后一个函数应包含用于重置过滤器/重新构建数组/从coredata获取所有对象的代码(如果这就是你正在做的事情)并重新加载tableView。