Кнопка Отмены UISearchController Не Кликабельна


Есть много вопросов/ответов на это, но, к сожалению, ни один из них не работает.

У меня есть подкласс UICollectionViewController, который я хочу, чтобы его элементы collectionView были доступны для поиска. Поэтому я использую UISearchController, но обрабатываю отфильтрованные collectionView элементы в self, поэтому установите searchResultsController равным нулю.

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

}

Я могу ввести текст в строку поиска, отфильтровать мое представление коллекции и успешно перезагрузить его по мере ввода текста. Более того, я могу нажмите кнопку "Поиск" на клавиатуре, которая вызывает метод searchBarSearchButtonClicked.

Введите описание изображения здесь

Однако, хотя кнопка Cancel видна (см. выше), она не кажется кликабельной. Таким образом, метод searchBarCancelButtonClicked не вызывается.

Что я здесь делаю не так, пожалуйста?
1 2

1 ответ:

Обязательно вызовите 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

    }

}