UISearchController 取消按钮不可点击

UISearchController Cancel Button Not Clickable

其中有很多 questions/answers,但不幸的是 none 其中有效。

我有一个 UICollectionViewController 的子类,我希望它的 collectionView 项可以搜索。因此,我使用 UISearchController 但处理 self 中筛选的 collectionView 项,因此将 searchResultsController 设置为 nil。

class CollectionViewController: UICollectionViewController {

    var searchController: UISearchController!

    override func viewDidLoad() {

        super.viewDidLoad()

        self.becomeFirstResponder()

        searchController = UISearchController(searchResultsController: nil)
        searchController.delegate = self
        searchController.searchBar.delegate = self
        searchController.searchBar.isUserInteractionEnabled = true

        navigationItem.searchController = searchController

    }

}      

我按如下方式实现所需的委托方法:

extension CollectionViewController:: UISearchControllerDelegate {
}

extension CollectionViewController:: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        collectionView?.reloadData()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        print("searchBarCancelButtonClicked")
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        print("searchBarSearchButtonClicked")
    }

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        print("searchBarTextDidEndEditing")
        collectionView?.reloadData()
    }

}

我可以在搜索栏中输入文本,过滤我的 collection 视图并在输入文本时成功重新加载它。此外,我可以在键盘上单击 "Search",它会调用 searchBarSearchButtonClicked 方法。

然而,尽管 Cancel 按钮可见(见上文),但似乎不可点击。因此,searchBarCancelButtonClicked 方法不会被调用。

请问我哪里做错了?

确保在声明委托后调用 definesPresentationContext = true

class CollectionViewController: UICollectionViewController {

    var searchController: UISearchController!

    override func viewDidLoad() {

        super.viewDidLoad()

        self.becomeFirstResponder()

        searchController = UISearchController(searchResultsController: nil)
        searchController.delegate = self
        searchController.searchBar.delegate = self

        self.definesPresentationContext = true .  // ADD 

        searchController.searchBar.isUserInteractionEnabled = true

        navigationItem.searchController = searchController

    }

}