关闭UISearchController的searchResultsUpdater需要按两次

问题描述 投票:0回答:2

我有一个搜索按钮,按下时会显示

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
    }
ios swift uisearchcontroller
2个回答
7
投票

以下两个步骤应该可以实现您正在寻找的技巧:

首先,您需要在选择一行后取消搜索,如下所示:

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)
}
}

0
投票

处理此问题的正确方法是要求呈现的视图控制器关闭,而不是

self

这是预期的行为。来自Apple 文档

呈现的视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,UIKit 会要求呈现的视图控制器处理解雇。

所以发生在你身上的是:

呈现视图控制器 (PVC) -> 呈现视图控制器 (PVD) -> 搜索结果视图控制器 (SRVC)

当您(第一次)从 PVD 致电

self.dismissViewControllerAnimated
时,您实际上要求的是 PVD 解雇 SRVC。一旦 SRVC 被解除,再次调用
self.dismissViewControllerAnimated
意味着 UIKit 要求呈现视图控制器处理解除(根据文档)。因此需要点击 2 次才能关闭当前控制器。

您只需从 PVC 调用

dismiss
即可解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.