[英]Swift Navigationbar searchbar dismiss search text on click
When I search in the search bar, it gives me results accordingly, but when I click outside to select my option, the search bar placeholder becomes nil and only the searched option is available. 当我在搜索栏中搜索时,它会相应地给我结果,但是当我在外部单击以选择选项时,搜索栏占位符将变为nil,只有搜索到的选项可用。 To get all the options, I have to again open search bar and press cancel which reloads the tableview to show all the option.
要获取所有选项,我必须再次打开搜索栏,然后按“取消”,这将重新加载表格视图以显示所有选项。
Home Screen 主屏幕
Entering text in search bar 在搜索栏中输入文字
After clicked on the screen 点击屏幕后
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()
}
}
I am new to Swift. 我是Swift的新手。
First, you should let the updateSearchResults(for:)
to make the filtering/updating work, that is its only purpose. 首先,您应该让
updateSearchResults(for:)
使过滤/更新工作,这是它的唯一目的。
And for the answer, maybe you are setting the isActive
method of the UISearchController
to false
when tapping outside the searchBar
, causing the text inside it to be deleted, and not allowing the search controller to update accordingly to reload all the data again. 对于答案,也许您是在将
searchBar
外部点击时将UISearchController
的isActive
方法设置为false
,从而导致其中的文本被删除,并且不允许搜索控制器进行相应更新以重新加载所有数据。
So, a solution could be adding the searchBarTextDidEndEditing(_)
method to reset the data source when the searchBar
is no longer the first responder: 因此,一个解决方案可以是将所述
searchBarTextDidEndEditing(_)
方法中,当重置数据源searchBar
不再是对第一响应者:
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searching = false
searchResult = locationNames
collectionView.reloadData()
}
Or even better, let the updateSearchResults(for:)
method to update the data automatically: 甚至更好的是,让
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()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.