我在 iOS 9 中使用 UISearchController 测试了以下内容。
默认情况下,当 UISearchBar 中没有文本时,显示的表格将是您的原始表格视图(以下称为 originalTableView)。根据dimsBackgroundDuringPresentation 的值,这可能有也可能没有黑色透明层。
一旦用户在 UISearchBar 中输入 any 文本,就会显示新表格视图的内容(我将其称为 searchTableView)。 p>
请注意,在这两种解决方案中,我实现 UISearchController 的方式类似于 Apple 在 this example 中的做法;即有两个独立的 UITableViewController 负责显示数据。
解决方案一:实现复杂,动画更流畅
为了更流畅的动画:
- 实现 UISearchControllerDelegate 的 willPresentSearchController 和 willDismissSearchController 方法。
- 在 willPresent 中,更新您 originalTableView 的数据以准备显示您想要的任何零文本数据,然后调用
reloadData()。
- 在 willDismiss 中,还原流程以显示原始内容并调用
reloadData()。
例子:
// here tableView refers to originalTableView
extension ViewController: UISearchControllerDelegate {
func willPresentSearchController(searchController: UISearchController) {
data = ["A", "B", "C"]
tableView.reloadData()
}
func willDismissSearchController(searchController: UISearchController) {
data = ["a", "b", "c"]
tableView.reloadData()
}
}
在这个虚构的例子中,当用户没有关注 UISearchBar 时,数据显示为a,b,c,但当用户点击 UISearchBar 时,数据显示为A,B,C。
解决方案 2:快速实施,不连贯的动画
不用在 originalTableView 和 searchTableView 中实现搜索控制器的逻辑,您可以使用此解决方案来简单地显示 searchTableView,即使它默认隐藏。
您很可能已经在实现 UISearchResultsUpdating 协议。通过在该方法中简单地调用tableView.hidden = false,你应该得到你所追求的行为;尽管动画不那么出色。
// here tableView refers to searchTableView
extension SearchViewController: UISearchResultsUpdating {
func updateSearchResultsForSearchController(searchController: UISearchController) {
tableView.hidden = false
filterData(text: searchController.searchBar.text!)
tableView.reloadData()
}
}