Кнопка Отмены 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 ответ:
Обязательно вызовите
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 } }