На это есть много вопросов / ответов, но, к сожалению, ни один из них не работает.
У меня есть подкласс 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
не вызывается.
Что я здесь не так делаю, пожалуйста?