UIKit SearchBar 过滤 textDidChange 中的两个数组
Posted
技术标签:
【中文标题】UIKit SearchBar 过滤 textDidChange 中的两个数组【英文标题】:UIKit SearchBar Filter Two Arrays in textDidChange 【发布时间】:2021-06-01 11:18:36 【问题描述】:我有两个已初始化和未初始化的数组,如下:
var colours: [String] = ["Blue", "Red", "Green", "Yellow"]
var numbers: [Int] = [11, 12, 13, 14]
var coloursFiltered: [String]?
var numbersFiltered: [Int]?
在我的搜索栏中,我只能过滤textDidChange
函数中的一个数组,如下所示:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
coloursFiltered = colours.filter( item -> Bool in
if searchText.isEmpty return true
return item.lowercased().contains(searchText.lowercased())
)
tableView.reloadData()
/* Later in the Code */
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return coloursFiltered!.count
我还需要过滤numbers
数组以匹配过滤后的colours
数组的相应索引。我不能这样做,因为我无法访问 colours.filter
函数中的当前索引。这是为了达到以下目的:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
self.tableView.register(UINib.init(nibName: "ItemTableViewCell", bundle: nil), forCellReuseIdentifier: "ItemTableViewCell")
let cell = self.tableView.dequeueReusableCell(withIdentifier: "ItemTableViewCell", for: indexPath) as! ItemTableViewCell
cell.name.text = "\(coloursFiltered![indexPath.row])"
cell.code.text = ""\(numbersFiltered![indexPath.row])" // I need this to work
return cell
有没有办法使用相同的字符串过滤两个数组?
【问题讨论】:
与其寻找解决方案重构代码以使用 Sh_Khan 建议的结构。多个数组作为数据源太可怕了。 我最终确实重构了我的代码并使用了结构模型。感谢您的建议。 【参考方案1】:你最好有一个模型
struct Item
let color:String
let number:Int
然后
var all = [Item(color:"Blue",number:11),.....]
var coloursFiltered = [Item]()
然后过滤它
coloursFiltered = all.filter( item -> Bool in
if searchText.isEmpty return true
return item.color.lowercased().contains(searchText.lowercased())
)
tableView.reloadData()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return coloursFiltered.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
self.tableView.register(UINib(nibName: "ItemTableViewCell", bundle: nil), forCellReuseIdentifier: "ItemTableViewCell")
let cell = self.tableView.dequeueReusableCell(withIdentifier: "ItemTableViewCell", for: indexPath) as! ItemTableViewCell
let item = coloursFiltered[indexPath.row]
cell.name.text = item.color
cell.code.text = "\(item.number)"
return cell
【讨论】:
我发现您的解决方案很有效并且很有帮助。非常感谢。如果我需要过滤两个以上的分类/数组,您的解决方案也会好得多。我找到了一个不同且更简单的解决方案,我将发布。让我知道你的想法。【参考方案2】:我尝试了@Sh_Khan 的答案,它很有效并且很有帮助。这是我在受@Aju Antony启发的另一个问题中找到的解决方案的类似方法。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
let result = zip(colours, numbers).filter name, code in
name.lowercased().contains(searchText.lowercased()) ||
String(code).contains(searchText.lowercased())
let filteredNames = result.map( $0.0 )
let filteredCodes = result.map( $0.1 )
self.coloursFiltered = filteredNames
self.numberseFiltered = filteredCodes
tableView.reloadData()
【讨论】:
以上是关于UIKit SearchBar 过滤 textDidChange 中的两个数组的主要内容,如果未能解决你的问题,请参考以下文章
UISearchResultsUpdating 不基于 searchBar 文本过滤 collectionView
searchBar 过滤 tableViewCells didSelectItemAt indexPath 显示在 navigationBar Title