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

Ios 更改搜索字符串时,搜索栏未刷新搜索,ios,swift,uicollectionview,uisearchbar,Ios,Swift,Uicollectionview,Uisearchbar,我正在尝试实现一个搜索栏,在集合视图项后搜索项名称 到目前为止,这是我的代码: var filtrados = false func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if searchBar.text == nil || searchBar.text == "" { filtrados = false marcas

我正在尝试实现一个搜索栏,在集合视图项后搜索项名称

到目前为止,这是我的代码:

    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()


  }
这将进行搜索并过滤搜索的项目


我的问题是,如果我删除了一些搜索字符或单击“取消”按钮,则不会再次执行搜索,并且第一个搜索的项目仍保留在“集合”视图中。

无需在searchbar delegate didchangetext方法中执行搜索栏检查,我通常做的是在collectionView委托内创建功能,如果searchbar为nill,则使用主数组重新加载,如果不是nill,则使用包含searchbar文本的原始数组填充新数组,然后只需要在didchangetext内实现collectionView重新加载方法。将很快为您提供代码

无需在searchbar delegate didchangetext方法内执行搜索栏检查,我通常会在collectionView delegate内创建功能,如果searchbar为nill,则使用主数组重新加载,如果不是nill,则使用包含搜索栏文本的原始数组填充新数组,然后您只需要在didchangetext内部实现collectionView重载方法。将很快为您提供代码

这是因为您正在覆盖变量
marcas
。您正在将筛选数组设置为相同的变量,因此当搜索栏文本为空时。过滤后的数组将是空的,变量
marcas
也是空的。您需要做的是创建两个变量:
  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()
     }
i、 e

var marcas=[YourStruct]()
var marcasfilteradas=[YourStruct]()
因此,您可以将过滤行更改为:

marcasfilteradas=marcas.filter{$0.nombre.lowercased().contains(searchText.lowercased()}
您可以将collectionView方法更改为以下内容:

扩展YourViewController:UICollectionViewDataSource{ func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{ filtrados?marcasFiltradas.count:marcas.count } func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{ let cell=collectionView.dequeueReusableCell(withReuseIdentifier:“cell”,for:indexath) 设marca=filterados?marcasfilteradas[indexPath.row]:marcas[indexPath.row] //你的代码 返回单元 } }
这是因为您正在覆盖变量
marcas
。您正在将筛选数组设置为同一个变量,因此当搜索栏文本为空时,筛选数组将为空,变量
marcas
也将为空。您需要做的是创建两个变量: i、 e

var marcas=[YourStruct]()
var marcasfilteradas=[YourStruct]()
因此,您可以将过滤行更改为:

marcasfilteradas=marcas.filter{$0.nombre.lowercased().contains(searchText.lowercased()}
您可以将collectionView方法更改为以下内容:

扩展YourViewController:UICollectionViewDataSource{ func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{ filtrados?marcasFiltradas.count:marcas.count } func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{ let cell=collectionView.dequeueReusableCell(withReuseIdentifier:“cell”,for:indexath) 设marca=filterados?marcasfilteradas[indexPath.row]:marcas[indexPath.row] //你的代码 返回单元 } }

问题在此条件下filtrados=true&如果条件更改时从搜索文本中删除一个或两个字符,则条件保持为true&文本既不是nil也不是空为什么使用条件?``如果searchBar.text==nil | | searchBar.text==“”“``问题在此条件下filtrados=true&如果条件更改时从搜索文本中删除一个或两个字符,则条件保持为true&文本既不为nil也不为空为什么使用条件?``如果searchBar.text==nil | | searchBar.text==”“``您的提案中的searchdata是什么?它是一个数据数组的副本,您将在其中搜索数据并删除与文本不匹配的另一个。换句话说,它是同一个数组的副本,您将在其中查找所有数据。我已创建了另一个名为marcasfiltradas的数据数组。您介意告诉我如何完全执行此操作吗?还有其他错误在您的代码上,如数据模型。您的提案中的searchdata是什么?它是一个数据数组的副本,您将在其中搜索数据并删除与文本不匹配的另一个。换句话说,它是同一个数组的副本,您将在其中查找所有数据。我已经创建了另一个名为marcasfiltradas的数据数组。您介意告诉我如何完成吗y?您的代码中还有其他错误,如数据模型。谢谢,我将等待您的建议。这就是我提供的。谢谢,我将等待您的建议。这就是我提供的。请让我用您的建议检查我的新代码。我已经实现了两个数组:var marcas=[marcas]()/var marcasFiltradas:[marcas]=[marcas]()@mvasco您想创建聊天室吗?嗨,Nicolas,我对同一提案有另一个问题。我们昨天解决的所有问题都很好,但现在单击一个项目,应用程序会抛出一个例外。请让我用您的提案检查我的新代码。我已经实现了两个数组:var marcas=[marcas]()/var marcasfilteradas:[Marcas]=[Marcas]()@mvasco您想创建聊天室吗?嗨,Nicolas,我对同一提案有另一个问题。我们昨天解决的所有问题都很好,但现在单击某个项目,应用程序会抛出异常