Swift中如何检测Tab Bar索引变化并按来源筛选数组?
这问题我之前做类似功能时也遇到过,最简单直接的方式就是让MainViewController知道跳转的来源标签页,然后根据来源筛选数组就行,给你一步步拆解实现:
实现方案
1. 给MainViewController添加来源标记与筛选逻辑
首先在MainVC里新增一个变量用来记录跳转过来的标签索引,再写一个筛选数组的方法,最后在视图即将显示时执行筛选并刷新表格:
class MainViewController: UIViewController, UITableViewDataSource { // 你的原始数据数组 let originalDataArray = ["元素0", "元素1", "元素2", "元素3", "元素4", "元素5"] // 用于表格展示的筛选后数组 var filteredDataArray: [String] = [] // 记录跳转来源的标签索引,默认0(Main自己) var sourceTabIndex: Int = 0 @IBOutlet weak var tableView: UITableView! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 每次回到Main页面时,根据来源筛选数组 filterDataBySourceIndex() tableView.reloadData() } private func filterDataBySourceIndex() { switch sourceTabIndex { case 1: // 从TabOne跳转来,只保留奇数索引的元素 filteredDataArray = originalDataArray.enumerated() .filter { $0.offset % 2 == 1 } .map { $0.element } case 2: // 从TabTwo跳转来,只保留偶数索引的元素 filteredDataArray = originalDataArray.enumerated() .filter { $0.offset % 2 == 0 } .map { $0.element } default: // 默认显示全部元素 filteredDataArray = originalDataArray } } // UITableView数据源方法 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return filteredDataArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath) cell.textLabel?.text = filteredDataArray[indexPath.row] return cell } }
2. 修改TabOne和TabTwo的按钮点击逻辑
在切换到Main标签页之前,先找到MainVC的实例,给它的sourceTabIndex赋值,明确跳转来源:
// TabOneViewController中的按钮方法 @IBAction func mypost(_ sender: Any) { // 获取MainVC实例并标记来源 if let mainVC = tabBarController?.viewControllers?[0] as? MainViewController { mainVC.sourceTabIndex = 1 } tabBarController?.selectedIndex = 0 }
// TabTwoViewController中的按钮方法 @IBAction func mypost(_ sender: Any) { if let mainVC = tabBarController?.viewControllers?[0] as? MainViewController { mainVC.sourceTabIndex = 2 } tabBarController?.selectedIndex = 0 }
额外提示
- 选择
viewWillAppear是因为MainVC只会初始化一次,每次从其他标签切回来时,这个方法都会触发,能保证每次都根据最新的来源筛选数据。 - 如果你的原始数组是动态更新的,记得在数组变化后调用
filterDataBySourceIndex()和tableView.reloadData()来同步表格显示。
内容的提问来源于stack exchange,提问作者Chao Peng
相关产品推荐
相关产品推荐

