有很多问题/答案,但不幸的是,它们都没有。
我有一个UICollectionViewController
的子类,我希望它的collectionView
项可以搜索。因此,我使用UISearchController
但处理collectionView
中已过滤的self
项,因此将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()
}
}
我可以在搜索栏中输入文字,过滤我的馆藏视图,并在输入文字时成功重新加载。此外,我可以点击键盘上的“搜索”,它会调用searchBarSearchButtonClicked
方法。
但是,尽管Cancel
按钮可见(见上文),但它似乎不可点击。因此,searchBarCancelButtonClicked
方法不会被调用。
我在这做错了什么,拜托?
答案 0 :(得分:2)
确保在宣布代表
后致电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
}
}