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

无Storyboard下通过Delegate更新UITableView数据失败求助

解决UITableView.reloadData()不生效的问题

问题根源

你在AppDelegate里创建的ProductDetailController和CatalogueController实例,和实际运行时导航栈中显示的控制器不是同一个对象!当你调用代理方法时,其实是通知了AppDelegate里那个从未被展示过的ProductDetailController实例,而屏幕上正在显示的控制器根本没收到回调,自然reloadData()不会有任何效果。


解决方案

1. 在跳转时正确设置代理

不要在AppDelegate里创建新的控制器实例来绑定代理,而是在两个控制器的跳转流程中,获取即将展示的目标控制器实例,再设置代理关系。

举个例子,如果是从CatalogueController跳转到ProductDetailController:

// 在CatalogueController的跳转方法中
func navigateToProductDetail() {
    let productDetailVC = ProductDetailController()
    // 把当前控制器的代理指向即将跳转的目标控制器
    self.catalogueDelegate = productDetailVC
    navigationController?.pushViewController(productDetailVC, animated: true)
}

如果是从ProductDetailController跳转到CatalogueController后需要回调数据:

// 在ProductDetailController的跳转方法中
func navigateToCatalogue() {
    let catalogueVC = CatalogueController()
    // 把目标控制器的代理指向当前正在显示的控制器
    catalogueVC.catalogueDelegate = self
    navigationController?.pushViewController(catalogueVC, animated: true)
}

2. 确保UI操作在主线程执行

UI更新必须在主线程完成,哪怕你能打印出数据,如果代理方法是在子线程触发的,reloadData()也不会生效。在transferProduct方法里加上主线程判断:

func transferProduct(_ product: Product) {
    // 先把数据添加到表格的数据源数组里
    self.products.append(product)
    
    // 强制在主线程刷新表格
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

3. 检查数据源与表格配置

  • 确认你在transferProduct里已经把接收到的product正确添加到了表格的数据源数组(比如products);
  • 检查表格的dataSource和delegate是否在viewDidLoad里正确设置:
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
    }
    
  • 确保numberOfRowsInSection、cellForRowAt这些数据源方法是基于更新后的数组返回数据的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:19:44