ios - Swift Navigationbar 搜索栏在单击时关闭搜索文本
问题描述
当我在搜索栏中搜索时,它会为我提供相应的结果,但是当我在外部单击以选择我的选项时,搜索栏占位符变为 nil,并且只有搜索到的选项可用。要获得所有选项,我必须再次打开搜索栏并按取消重新加载表格视图以显示所有选项。
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource,UISearchControllerDelegate,UISearchBarDelegate {
let locationNames = ["Python", "C#", "Machine Learning"]
let locationImages = [UIImage(named: "hawaiiResort"), UIImage(named: "mountainExpedition"), UIImage(named: "scubaDiving")]
let locationDescription = ["Beautiful resort off the coast of Hawaii", "Exhilarating mountainous expedition through Yosemite National Park", "Awesome Scuba Diving adventure in the Gulf of Mexico"]
let searchController = UISearchController(searchResultsController: nil)
@IBOutlet weak var collectionView: UICollectionView!
var searchResult = [String]()
var searching = false
override func viewDidLoad() {
navigationItem.title = "Courses"
navigationController?.navigationBar.prefersLargeTitles = true
self.navigationItem.largeTitleDisplayMode = .always
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
navigationItem.searchController = searchController
definesPresentationContext = true
currentPage = 0
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if(searching){
return searchResult.count
}
else{
return 3
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
if(searching)
{
cell.locationName.text = searchResult[indexPath.row]
let people = locationNames.index{$0 == String(searchResult[indexPath.row])}
cell.locationImage.image = locationImages[people ?? 0]
cell.locationDescription.text = locationDescription[people ?? 0]
}
else
{
cell.locationImage.image = locationImages[indexPath.row]
cell.locationName.text = locationNames[indexPath.row]
cell.locationDescription.text = locationDescription[indexPath.row]
}
cell.contentView.layer.cornerRadius = 4.0
cell.contentView.layer.borderWidth = 1.0
cell.contentView.layer.borderColor = UIColor.clear.cgColor
cell.contentView.layer.masksToBounds = false
cell.layer.shadowColor = UIColor.gray.cgColor
cell.layer.shadowOffset = CGSize(width: 0, height: 1.0)
cell.layer.shadowRadius = 4.0
cell.layer.shadowOpacity = 1.0
cell.layer.masksToBounds = false
cell.layer.shadowPath = UIBezierPath(roundedRect: cell.bounds, cornerRadius: cell.contentView.layer.cornerRadius).cgPath
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController
vc.selectedCourse = locationNames[indexPath.row]
self.navigationController?.pushViewController(vc, animated: true)
}
}
extension ViewController: UISearchResultsUpdating{
func updateSearchResults(for searchController: UISearchController) {
guard let searchText = searchController.searchBar.text else { return }
searchResult = locationNames.filter({$0.prefix(searchText.count) == searchText})
searching = true
collectionView.reloadData()
}
// func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// searchResult = locationNames.filter({$0.prefix(searchText.count) == searchText})
// searching = true
// collectionView.reloadData()
// }
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
NSLog("%@",searchBar.text ?? "");
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searching = false
searchBar.text = ""
collectionView.reloadData()
}
}
我是斯威夫特的新手。
解决方案
首先,您应该让updateSearchResults(for:)
过滤/更新工作,这是它的唯一目的。
对于答案,也许您在点击外部时将 的isActive
方法设置UISearchController
为,导致其中的文本被删除,并且不允许搜索控制器相应地更新以再次重新加载所有数据。false
searchBar
因此,一个解决方案可能是在不再是第一响应者searchBarTextDidEndEditing(_)
时添加重置数据源的方法:searchBar
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searching = false
searchResult = locationNames
collectionView.reloadData()
}
甚至更好,让updateSearchResults(for:)
方法自动更新数据:
func updateSearchResults(for searchController: UISearchController) {
guard let searchText = searchController.searchBar.text else { return }
searchResult = locationNames.filter({$0.prefix(searchText.count) == searchText})
collectionView.reloadData()
}
推荐阅读
- vpn - 通过 OpenVPN 记录访问过的 URL?
- ios - 无法创建新日历 iOS Swift
- python - “连接”层需要具有匹配形状的输入,除了连接轴 Keras
- javascript - jQuery.Keyframes 未定义 isSupported
- javascript - 组件中映射的 vuex getter 未更新
- python - 如何将多个深度嵌套的 JSON 文件展平为 pandas 数据框?
- swift - 在两个单独的类中使用一个对象的最佳方法是什么?
- python - 通过单击获取 numpy 数组图像中某个点的索引
- javascript - 如何在特定时间后更新快速 js 路由器中的项目?
- php - 为什么这段代码使用 array_filter 和 array_map 来过滤整数数组?