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

调用tableView.reloadData后未触发cellForRowAtIndexPath问题求助

tableView reloadData后cellForRowAtIndexPath未触发的解决方案

我有一个包含tableView的ViewController,用于展示模型列表,但调用reloadData后,cellForRowAtIndexPath却莫名未被触发。已在viewDidLoad中设置tableView的dataSource和delegate,确认tableView已与VC关联,且numberOfRowsInSection返回正确值。

相关代码

protocol UserListDisplayLogic: AnyObject {
    func displayUserList(viewModel: FetchUserList.ViewModel)
}

class UserListViewController: UIViewController {
    
    // MARK: IBOutlets
    @IBOutlet weak var tableView: UITableView!
    
    // MARK: Properties
    var interactor: UserListBusinessLogic?
    var router: UserListRouting?
    var userList: [DisplayedUserListProtocol]?
    
    // MARK: LifeCycle
    override func viewDidLoad() {
        super.viewDidLoad()
        setUpView()
        interactor?.getUserList()
    }
    
    // MARK: SetUp View
    private func setUpView() {
        setUpTableView()
    }
    
    private func setUpTableView() {
        tableView.dataSource = self
        tableView.delegate = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: userListTableViewCell, bundle: nil), forCellReuseIdentifier: userListTableViewCell)
    }
    
}

// MARK: TableViewDelegate && TableViewDataSource
extension UserListViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userList?.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: userListTableViewCell, for: indexPath) as! UserListTableViewCell
        cell.config(viewModel: userList?[indexPath.row])
        return cell
    }
}

// MARK: UserListDisplayLogic
extension UserListViewController: UserListDisplayLogic {
    func displayUserList(viewModel: FetchUserList.ViewModel) {
        userList = viewModel.displayedUserList
        tableView.reloadData()
    }
}

排查方向及解决方法

  • 检查tableView的可见性与布局:如果tableView的frame为空、约束错误导致视图被挤出屏幕,或被设置为hidden = true,reloadData后不会触发cell渲染。可以在displayUserList中打印tableView.frame和tableView.isHidden确认,同时在Storyboard/XIB中检查tableView的约束是否完整(如上下左右与父视图绑定、高度设置合理)。
  • 确保reloadData在主线程执行:网络请求回调通常在子线程,直接调用tableView.reloadData()会无效。修改代码将刷新操作切到主线程:
    func displayUserList(viewModel: FetchUserList.ViewModel) {
        userList = viewModel.displayedUserList
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
    
  • 校验cell复用标识符:确认userListTableViewCell常量的字符串值与XIB中cell的Identifier完全一致,包括大小写和拼写。
  • 验证section数量:如果未实现numberOfSections(in:)方法,默认返回1,但如果意外重写该方法返回0,会导致无数据行。可以显式添加该方法确保section数量正确:
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
  • 再次确认数据数量:在numberOfRowsInSection和displayUserList中分别打印userList?.count和viewModel.displayedUserList.count,确认两者数值大于0且一致,排除数据未正确赋值的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:12:54