根据 UISearchBar 输入过滤 TableView (Swift)

Filter TableView, depending on UISearchBar input (Swift)

我想做什么:我想根据 UISearchBar 中的用户输入来过滤上面有文本的 TableViewCells。

我的问题: 我得到它来处理简单的单元格。但现在我使用自定义的,我用结构配置的,现在我不知道如何过滤它们。

这是我的代码:

import UIKit
import Firebase

class searchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
    
    @IBOutlet var searchy: UISearchBar!
    @IBOutlet var tabley: UITableView!
    
    var searchingNames = [String()]
    var searching = false
    var datas = [UserSearch]()

    override func viewDidLoad() {
        super.viewDidLoad()
        tabley.delegate = self
        tabley.dataSource = self
        searchy.delegate = self
        populateSearch()
        tabley.register(searchTableViewCell.nib(), forCellReuseIdentifier: searchTableViewCell.identifier)
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        if searching == true {
            return searchingNames.count
        } else{
            return datas.count
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if searching == true {
            let post = datas[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: searchTableViewCell.identifier, for: indexPath) as! searchTableViewCell
            cell.configure(with: post)
            return cell
        } else{
            let post = datas[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: searchTableViewCell.identifier, for: indexPath) as! searchTableViewCell
            cell.configure(with: post)
            return cell
        }
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        searchingNames = datas.filter({[=11=].lowercased().prefix(searchText.count) == searchText.lowercased()}) // Cannot assign value of type '[UserSearch]' to type '[String]'
            // Value of type 'UserSearch' has no member 'lowercased'
        searching = true
        tabley.reloadData()
    }
}

struct UserSearch {
    var id: String
    var name: String
    var pfp: String
}

您必须过滤 UserSearch 的字符串 属性 例如 name.

并且您必须考虑用户清除搜索字段以将 searching 重置为 false

并且有一个更有效的API来检查子串


首先搜索结果的数组必须与数据源数组的类型相同

var searchingNames = [UserSearch]()

textDidChange替换为

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
   if searchText.isEmpty {
      searchingNames.removeAll()
      searching = false
   } else {
      searchingNames = datas.filter{ [=11=].name.range(of: searchText, options: [.anchored, .caseInsensitive]) != nil}
      searching = true
   }
   tabley.reloadData()
}
  • .anchored 从字符串开头搜索
  • .caseInsensitive 是不言自明的。

PS:在cellForRow是一个错误。在 searching == true 范围内替换

let post = datas[indexPath.row]

 let post = searchingNames[indexPath.row]

您甚至可以将代码缩减为

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let post = searching ? searchingNames[indexPath.row] : datas[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: searchTableViewCell.identifier, for: indexPath) as! searchTableViewCell
    cell.configure(with: post)
    return cell
}