如何实现目标样式搜索控制器并跨控制器过滤TableView列表?
实现跨控制器的搜索过滤方案
我来帮你捋清楚怎么完成这个搜索过滤的逻辑哈,核心思路就是让负责搜索的蓝色视图控制器把过滤后的数据传递给左下角的表视图控制器,再由表视图控制器更新表格展示。下面是具体的实现步骤:
1. 建立两个控制器的通信通道
因为搜索逻辑和表格展示分属两个不同的VC,我们需要一个可靠的方式传递数据,这里推荐用闭包(实现起来更简洁):
第一步:在蓝色VC定义闭包属性
在你的蓝色视图控制器里,先添加一个闭包属性,用来传递过滤后的数据源:
// 蓝色视图控制器内部 var searchResultsUpdated: (([YourDataType]) -> Void)?
(把YourDataType换成你实际的数据模型类型,比如User、Product之类的)
第二步:关联表视图VC的刷新逻辑
找到左下角表视图控制器的实例(比如通过故事板的容器视图子控制器、导航栈查找,或者你故事板里的引用关系),把表视图VC的刷新方法绑定到这个闭包上:
// 蓝色VC里,在viewDidLoad或者获取到表视图VC实例的地方 if let tableViewVC = self.childViewControllers.first(where: { $0 is YourTableViewController }) as? YourTableViewController { self.searchResultsUpdated = { [weak self] filteredData in tableViewVC.updateDisplayData(with: filteredData) } }
第三步:表视图VC接收数据的方法
在表视图控制器里,添加存储数据源的属性和接收数据的方法:
// 表视图控制器内部 var originalFullData: [YourDataType] = [] // 存储全量原始数据 var filteredData: [YourDataType] = [] // 存储过滤后要展示的数据 func updateDisplayData(with data: [YourDataType]) { filteredData = data tableView.reloadData() }
2. 在搜索代理方法中处理过滤逻辑
在蓝色VC的UISearchResultsUpdating代理方法里,根据搜索文本过滤全量数据,然后通过闭包把结果传给表视图VC:
// 蓝色VC内,实现UISearchResultsUpdating代理方法 func updateSearchResults(for searchController: UISearchController) { guard let searchText = searchController.searchBar.text?.lowercased() else { searchResultsUpdated?(originalFullData) return } if searchText.isEmpty { // 搜索框为空时,展示全量数据 searchResultsUpdated?(originalFullData) } else { // 执行过滤逻辑,这里假设数据模型有`title`属性可匹配,你可以换成自己的匹配字段 let results = originalFullData.filter { item in item.title.lowercased().contains(searchText) } searchResultsUpdated?(results) } }
3. 表视图展示过滤后的数据
最后,在表视图控制器的UITableViewDataSource方法里,使用filteredData来渲染单元格:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return filteredData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath) let item = filteredData[indexPath.row] cell.textLabel?.text = item.title // 根据你的数据模型调整展示内容 return cell }
额外注意点
- 确保蓝色VC的
originalFullData和表视图VC的originalFullData初始数据一致; - 如果表视图VC是通过容器视图嵌入的,可以在蓝色VC的
prepare(for:sender:)里获取子控制器实例; - 闭包中记得用
[weak self]避免循环引用。
内容的提问来源于stack exchange,提问作者user3051673
相关产品推荐
相关产品推荐

