更改搜索字符串时,搜索栏不刷新搜索

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
    }
}