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

