如何在UITableView上实现UISearchBar?搜索代理不触发怎么办
问题根因
代理方法签名写错,导致系统无法识别你实现了UISearchBar的文本变化回调,方法永远不会被触发。
你当前实现的方法名是searchClients(_:textDidChange:),但UISearchBarDelegate协议规定的文本变化回调的选择器是searchBar(_:textDidChange:)——方法名的开头必须是searchBar,和搜索栏的outlet名称没有关系。因为UISearchBarDelegate的代理方法都是可选实现的@objc方法,方法名不匹配时Xcode不会报编译错误,运行时也不会抛异常,只会表现为回调不触发。
修复步骤
- 把原有写错的代理方法替换为符合协议要求的正确签名版本:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { print("搜索关键词:\(searchText)") self.filteredArray.removeAll() if searchText.isEmpty { self.filteredArray = self.ClientList } else { self.filteredArray = self.ClientList.filter { $0.Name.lowercased().contains(searchText.lowercased()) } } self.tableView.reloadData() }
- 额外校验项(改完方法名仍不生效时排查):
- 确认UISearchBar未被上层视图遮挡,可正常接收点击、输入事件
- 确认搜索栏没有被其他手势识别器拦截输入事件
- 网络请求拉取完
ClientList的全量数据后,记得同步赋值给filteredArray,避免初始状态搜索无数据
内容的提问来源于stack exchange,提问作者Mike Volmar
相关产品推荐
相关产品推荐

