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,我对同一提案有另一个问题。我们昨天解决的所有问题都很好,但现在单击某个项目,应用程序会抛出异常