点击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
相关产品推荐
相关产品推荐

