Swift 3/4:SearchBar无法在TableView中正确过滤结果
解决SearchBar实时过滤TableView结果不生效的问题
这种实时搜索没反应的情况我之前开发弹窗的时候也踩过坑,大概率是数据源管理或者搜索回调的环节没处理对,咱们一步步来修复:
维护双数据源是核心
你需要同时保留原始全量数据和过滤后的结果数据两个数组,不能直接修改原始数据来做过滤:// 假设你的人员模型是Person,包含name属性 var originalPersons: [Person] = [] // 存储所有人员数据 var filteredPersons: [Person] = [] // 存储搜索匹配的结果初始化的时候记得把
originalPersons赋值给filteredPersons,这样默认弹窗打开时显示全部内容。实现UISearchBarDelegate的文本变化回调
必须监听搜索框的文本输入变化,在回调里完成过滤逻辑并刷新表格:
首先要让你的ViewController遵守UISearchBarDelegate协议,然后在viewDidLoad里设置searchBar.delegate = self,接着实现下面的方法:func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // 根据搜索文本过滤数据 if searchText.isEmpty { // 搜索框为空时恢复显示全部数据 filteredPersons = originalPersons } else { // 忽略大小写的模糊匹配,适配用户不同的输入习惯 filteredPersons = originalPersons.filter { person in person.name.lowercased().contains(searchText.lowercased()) } } // 关键!过滤完成后一定要刷新TableView tableView.reloadData() }确保TableView数据源方法使用过滤后的数组
很多人容易在这里出错:明明过滤了数据,但TableView的数据源还是用原始数组,自然看不到变化。一定要把numberOfRows和cellForRow里的数据源换成filteredPersons:func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return filteredPersons.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCustomCellID", for: indexPath) as! CustomTableViewCell let currentPerson = filteredPersons[indexPath.row] cell.nameLabel.text = currentPerson.name // 这里根据你的业务逻辑设置M13CheckBox的选中状态 cell.checkBox.isChecked = // 比如判断该人员是否在已选列表中 return cell }可选:优化搜索体验的细节
比如处理取消按钮的逻辑,让用户点击取消时恢复初始状态:func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.text = "" filteredPersons = originalPersons tableView.reloadData() searchBar.resignFirstResponder() // 收起键盘,提升交互体验 }另外,自定义Cell的复用要注意重置状态,避免复选框状态混乱,在Cell的
prepareForReuse方法里重置:class CustomTableViewCell: UITableViewCell { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var checkBox: M13CheckBox! override func prepareForReuse() { super.prepareForReuse() nameLabel.text = nil checkBox.isChecked = false // 根据你的业务需求调整 } }
按照上面的步骤调整后,当你输入“Mar”时,TableView应该就能实时显示Mary、Margaret、Mallory这些匹配的结果了。
内容的提问来源于stack exchange,提问作者Bella
相关产品推荐
相关产品推荐

