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

从Presenter获取的数据未在ViewController的TableView Cell中显示

iOS MVP架构UITableView无法加载Presenter返回数据修复

核心问题点

你的代码里存在3个会直接导致数据无法渲染的问题:

  • 整个MVP三层的引用、代理关系完全没有初始化绑定:ViewController里的presenter属性只声明没赋值、Presenter里的interactor和回调代理presenter也没有绑定实例,调用presenter?.getDataFromInteractor()时因为可选链取值为nil,根本不会触发后续数据请求逻辑
  • UITableView的dataSource、delegate没有绑定到当前控制器,即使数据拉取成功,tableView也不会调用数据源方法渲染cell
  • 未校验cell复用标识匹配性:如果是纯代码实现的cell没有提前注册、或者Storyboard中设置的cell复用ID和代码里的"cell"不一致,会导致cell创建失败

修复代码

直接替换ViewController中的viewDidLoad方法即可:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 初始化MVP各层、绑定代理关系
    let interactor = Interactor()
    presenter = Presenter()
    presenter?.interactor = interactor
    interactor.delegate = presenter
    presenter?.presenter = self
    
    // 绑定tableView代理
    tableView.dataSource = self
    tableView.delegate = self
    
    // 如果是纯代码实现的cell,取消下面这行注释完成注册;如果是Storyboard拖的cell,确认复用ID设为"cell"即可
    // tableView.register(TableViewCell.self, forCellReuseIdentifier: "cell")
    
    presenter?.getDataFromInteractor()
}

排查提示

如果改完还是不展示,按顺序排查:

  1. 在didFinishGettingDataFromPresenter方法的print行加断点,确认回调是否触发、返回的data数组是否有值:如果没触发,检查Interactor的fetch方法里,网络/本地数据拉取完成后有没有正确调用代理的didFinishGettingData方法
  2. 确认Interactor回调给Presenter的逻辑是在主线程执行,如果是子线程触发的回调,要切回主线程再刷新UI,你现在写的reloadTable方法已经做了主线程保护,这部分逻辑是对的
  3. 检查TableViewCell的IBOutlet连线有没有断,避免赋值时控件是nil导致内容不显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:57:20