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

控制器中两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:23:29