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 过滤时忽略字符

searchBar 过滤 tableViewCells didSelectItemAt indexPath 显示在 navigationBar Title

Swift SearchBar 过滤和更新多个数组

SearchBar 过滤和调整 UITableView 单元格?

通过 searchBar 过滤 NSFetchedResultController 而不加载基本暂停?