我有一个搜索按钮,按下时会显示
ViewController
用于搜索功能。该视图控制器包含 UITableView
和 UISearchController
。
一切正常,但在我选择其中一个搜索结果之后。我想直接关闭这个视图控制器,但是第一次选择关闭取消然后再次选择将关闭视图控制器。就像下面一样,我只想一选解雇。谢谢!
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
searchViewController.searchBar.resignFirstResponder()
self.dismissViewControllerAnimated(false, completion: nil)
}
编辑
let searchViewController = UISearchController(searchResultsController: nil)
func configureSearchController() {
tableView.tableHeaderView = searchViewController.searchBar
searchViewController.delegate = self
searchViewController.searchResultsUpdater = self
self.definesPresentationContext = true
searchViewController.dimsBackgroundDuringPresentation = false
}
以下两个步骤应该可以实现您正在寻找的技巧:
首先,您需要在选择一行后取消搜索,如下所示:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
searchController.active = false
}
其次,您需要实现 UISearchControllerDelegate 的委托方法之一,以便在“取消”搜索时关闭视图控制器:
extension SearchViewController: UISearchControllerDelegate {
func willDismissSearchController(searchController: UISearchController) {
print("Will dimiss search controller")
self.dismissViewControllerAnimated(true, completion: nil)
}
}
处理此问题的正确方法是要求呈现的视图控制器关闭,而不是
self
。
这是预期的行为。来自Apple 文档:
呈现的视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,UIKit 会要求呈现的视图控制器处理解雇。
所以发生在你身上的是:
呈现视图控制器 (PVC) -> 呈现视图控制器 (PVD) -> 搜索结果视图控制器 (SRVC)
当您(第一次)从 PVD 致电
self.dismissViewControllerAnimated
时,您实际上要求的是 PVD 解雇 SRVC。一旦 SRVC 被解除,再次调用 self.dismissViewControllerAnimated
意味着 UIKit 要求呈现视图控制器处理解除(根据文档)。因此需要点击 2 次才能关闭当前控制器。
您只需从 PVC 调用
dismiss
即可解决此问题。