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

Swift开发:UITableViewDataSource数据传递异常问题求助

解决UITableViewDataSource中selectedItems为空的问题

看起来你遇到的核心问题是数据源实例不匹配——你在一个视图控制器里给ItemsDS.selectedItems赋值,但你的ItemsViewController里使用的数据源实例和这个不是同一个,导致数据没同步上。下面是具体的排查和解决步骤:

问题根源分析

你代码里的几个关键点暴露了问题:

  • 在跳转的VC里,你给ItemsDS.selectedItems赋值,但这个ItemsDS很可能是一个独立的实例(比如全局变量或者单独初始化的对象)
  • 而在ItemsViewController里,你设置tableView.dataSource = ItemDS(这里大概率是误用了类名而非实例,或者是另一个全新的实例)
  • 加上lazy var ItemVC = ItemsViewController()的延迟初始化逻辑,可能导致你赋值的实例和最终跳转的VC实例不是同一个,数据自然无法传递

具体解决方案

1. 让ItemsViewController持有自己的数据源实例

修改ItemsViewController,让它自己管理专属的数据源,避免外部独立实例带来的混乱:

class ItemsViewController: UITableViewController {
    // 让VC自己持有专属的数据源实例
    let itemDataSource = ItemDS() // 假设你的数据源类名为ItemDS
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 使用VC自己持有的数据源实例
        tableView.dataSource = itemDataSource
        tableView.register(MyCell.self, forCellReuseIdentifier: itemDataSource.cellId)
    }
}

2. 在跳转时直接给目标VC的数据源赋值

修改跳转VC的didSelectRowAt方法,直接操作即将跳转的ItemsViewController实例的数据源,确保实例完全一致:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 获取选中的items
    let targetItems = lists[indexPath.row].items
    // 创建ItemsViewController实例
    let itemsVC = ItemsViewController()
    // 直接给这个实例的数据源赋值
    itemsVC.itemDataSource.selectedItems = targetItems
    // 设置导航栏标题
    itemsVC.navigationItem.title = lists[indexPath.row].name
    // 刷新表格(必须添加,不然数据不会实时显示)
    itemsVC.tableView.reloadData()
    // 跳转页面
    navigationController?.pushViewController(itemsVC, animated: true)
}

3. 额外注意点

  • 不要使用全局的数据源实例:全局实例很容易导致多个VC操作不同实例,引发数据不同步的问题,让每个VC持有自己的数据源是更清晰的架构选择
  • 检查数据源类的selectedItems是否是可变的:确保它被声明为var而非let,不然赋值操作会静默失败
  • 原代码中的全局lazy var ItemVC建议移除,改为在跳转时创建新实例,避免实例复用导致的旧数据残留

这样修改后,你赋值的selectedItems就会和ItemsViewController里表格使用的数据源是同一个实例,数据就能正确传递,print(selectedItems)也会输出预期的内容了。

内容的提问来源于stack exchange,提问作者Nikolas Ioannou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:49