控制器中两个UITableView调用reloadData仅一个生效,求解决方案
问题排查与解决方案
1. 强制UI操作在主线程执行
Firebase的回调默认在后台线程,所有UI更新(包括reloadData和约束修改)必须在主线程完成。修改你的Firebase请求代码:
FirebaseManager.shared.fetchKebab { kebab in DispatchQueue.main.async { self.kebab = kebab self.kebabTableView.reloadData() self.updateTableViewHeight(self.kebabTableView) } } FirebaseManager.shared.fetchPizza { pizza in DispatchQueue.main.async { self.pizza = pizza self.pizzaTableView.reloadData() self.updateTableViewHeight(self.pizzaTableView) } } // 抽离高度更新为通用方法 private func updateTableViewHeight(_ tableView: UITableView) { CATransaction.begin() CATransaction.setCompletionBlock { tableView.snp.updateConstraints { make in make.height.equalTo(tableView.contentSize.height) } self.view.layoutIfNeeded() } tableView.layoutIfNeeded() CATransaction.commit() }
2. 修正Cell复用逻辑
在cellForRowAt中,必须使用传入的tableView参数复用Cell,而非直接调用实例变量,否则可能导致Cell无法正确创建:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "MealCell") as? MealCell else { return UITableViewCell() } if tableView == kebabTableView { cell.meal = kebab[indexPath.row] } else if tableView == pizzaTableView { cell.meal = pizza[indexPath.row] } cell.setup() return cell }
3. 确认TableView的Delegate/DataSource已正确绑定
在viewDidLoad中手动设置,或在Storyboard里拖拽关联控制器:
override func viewDidLoad() { super.viewDidLoad() kebabTableView.delegate = self kebabTableView.dataSource = self pizzaTableView.delegate = self pizzaTableView.dataSource = self // 其他初始化代码... }
4. 验证数据是否正确加载
在fetchPizza回调中打印数据数量,确认pizza数组不为空:
FirebaseManager.shared.fetchPizza { pizza in DispatchQueue.main.async { print("Pizza count: \(pizza.count)") // 检查数值是否大于0 self.pizza = pizza self.pizzaTableView.reloadData() self.updateTableViewHeight(self.pizzaTableView) } }
如果以上步骤完成后问题仍存在,可通过Debug View Hierarchy检查第二个TableView是否被其他视图遮挡,或约束是否存在冲突。
内容的提问来源于stack exchange,提问作者quavodanceq
相关产品推荐
相关产品推荐

