You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击CollectionView跳转后TableView无法填充数据怎么解决?

核心问题梳理

你现在的代码有三个核心错误:

  • UITableView的数据源方法写在了主控制器ViewController中,但实际承载TableView的是跳转后的TableViewController,二者是独立控制器,主控制器的方法不会被目标页的TableView调用
  • 点击CollectionViewCell跳转时,没有把选中的品牌对应的数据传递给TableViewController,目标页无数据可渲染
  • TableViewCell的现有配置逻辑和需求不匹配:你点击单个品牌后要展示的是该品牌下的车型列表,不是所有品牌名称

修复方案

1. 给跳转目标页TableViewController新增接收数据的属性,同时把TableView数据源逻辑移到该控制器内

class TableViewController: UIViewController {
    // 用于接收上层传过来的对应品牌的车型数组
    var carModels: [String] = []
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 绑定TableView数据源
        tableView.dataSource = self
    }
}

extension TableViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 行数等于当前品牌的车型数量
        return carModels.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        // 传入车型名称渲染Cell
        cell.configure(modelName: carModels[indexPath.row])
        return cell
    }
}

2. 修改TableViewCell的配置方法,适配车型展示逻辑

class TableViewCell: UITableViewCell {
    @IBOutlet weak var lbl: UILabel!
    // 修改参数为车型字符串
    func configure(modelName: String){
        lbl.text = modelName
    }
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

3. 修改主控制器的CollectionView点击逻辑,传递选中数据,同时删除主控制器内冗余的UITableViewDataSource相关代码

// 移除原来遵守的UITableViewDataSource协议
extension ViewController:UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let vc = storyboard?.instantiateViewController(identifier: "TableViewController") as? TableViewController
        // 拿到当前选中的品牌数据,把车型数组传递给目标页
        let selectedCar = cars[indexPath.row]
        vc?.carModels = selectedCar.carModel
        // 可选设置导航栏标题为品牌名,提升体验
        vc?.title = selectedCar.carName
        self.navigationController?.pushViewController(vc!, animated: true)
    }
}
// 同时删除主控制器内原来写的tableView numberOfRowsInSection、cellForRowAt两个方法,已经无用

内容的提问来源于stack exchange,提问作者Joe Rogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:57:03