更改搜索字符串时,搜索栏不刷新搜索
Searchbar is not refreshing the search when changing search string
我正在尝试实现一个搜索栏,以在集合视图项目后搜索项目名称。
到目前为止,这是我的代码:
var filtrados = false
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == nil || searchBar.text == "" {
filtrados = false
marcasCV.reloadData()
}
else {
filtrados = true
let buscado = searchBar.text!.lowercased()
print(marcas)
marcas = marcas.filter {marcas in
return (marcas.nombre.lowercased().contains(buscado) )
}
marcasCV.reloadData()
}
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
filtrados = false
marcasCV.reloadData()
}
这是在进行搜索并过滤搜索到的项目。
我的问题是,如果我删除了一些搜索字符或单击取消按钮,则不会再次执行搜索,并且第一个搜索到的项目仍保留在集合视图中。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
marcas = searchText.isEmpty ? marcasFiltradas : marcasFiltradas.filter({(marcasName: Marcas) -> Bool in
// If dataItem matches the searchText, return true to include it
return marcasName.name?.range(of: searchText, options: .caseInsensitive) != nil
})
marcasCV.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.text = ""
marcas = marcasFiltradas
searchBar.endEditing(true)
marcasCV.reloadData()
}
不需要在 searchbar 委托 didchangetext 方法中进行搜索栏检查,我通常做的是在 collectionView 委托中创建功能,如果 searchbar 为 nill 则重新加载主数组,如果不是 nill 则填充一个原始数组包含搜索栏文本的新数组,那么您只需要在 didchangetext 中实现一个 collectionView 重新加载方法。将很快为您提供代码。
那是因为您正在覆盖您的变量 marcas
。您正在将过滤后的数组设置为相同的变量,因此当您的 searchBar 文本为空时。过滤后的数组将为空,您的变量 marcas
也将为空。您要做的是创建两个变量:
即
var marcas = [YourStruct]()
var marcasFiltradas = [YourStruct]()
那么您可以将过滤行更改为:
marcasFiltradas = marcas.filter {[=11=].nombre.lowercased().contains(searchText.lowercased()}
并且您会将 collectionView 方法更改为如下所示:
extension YourViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
filtrados ? marcasFiltradas.count : marcas.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
let marca = filtrados ? marcasFiltradas[indexPath.row] : marcas[indexPath.row]
// your code
return cell
}
}
我正在尝试实现一个搜索栏,以在集合视图项目后搜索项目名称。
到目前为止,这是我的代码:
var filtrados = false
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == nil || searchBar.text == "" {
filtrados = false
marcasCV.reloadData()
}
else {
filtrados = true
let buscado = searchBar.text!.lowercased()
print(marcas)
marcas = marcas.filter {marcas in
return (marcas.nombre.lowercased().contains(buscado) )
}
marcasCV.reloadData()
}
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
filtrados = false
marcasCV.reloadData()
}
这是在进行搜索并过滤搜索到的项目。
我的问题是,如果我删除了一些搜索字符或单击取消按钮,则不会再次执行搜索,并且第一个搜索到的项目仍保留在集合视图中。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
marcas = searchText.isEmpty ? marcasFiltradas : marcasFiltradas.filter({(marcasName: Marcas) -> Bool in
// If dataItem matches the searchText, return true to include it
return marcasName.name?.range(of: searchText, options: .caseInsensitive) != nil
})
marcasCV.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.text = ""
marcas = marcasFiltradas
searchBar.endEditing(true)
marcasCV.reloadData()
}
不需要在 searchbar 委托 didchangetext 方法中进行搜索栏检查,我通常做的是在 collectionView 委托中创建功能,如果 searchbar 为 nill 则重新加载主数组,如果不是 nill 则填充一个原始数组包含搜索栏文本的新数组,那么您只需要在 didchangetext 中实现一个 collectionView 重新加载方法。将很快为您提供代码。
那是因为您正在覆盖您的变量 marcas
。您正在将过滤后的数组设置为相同的变量,因此当您的 searchBar 文本为空时。过滤后的数组将为空,您的变量 marcas
也将为空。您要做的是创建两个变量:
即
var marcas = [YourStruct]()
var marcasFiltradas = [YourStruct]()
那么您可以将过滤行更改为:
marcasFiltradas = marcas.filter {[=11=].nombre.lowercased().contains(searchText.lowercased()}
并且您会将 collectionView 方法更改为如下所示:
extension YourViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
filtrados ? marcasFiltradas.count : marcas.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
let marca = filtrados ? marcasFiltradas[indexPath.row] : marcas[indexPath.row]
// your code
return cell
}
}