从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() }
排查提示
如果改完还是不展示,按顺序排查:
- 在
didFinishGettingDataFromPresenter方法的print行加断点,确认回调是否触发、返回的data数组是否有值:如果没触发,检查Interactor的fetch方法里,网络/本地数据拉取完成后有没有正确调用代理的didFinishGettingData方法 - 确认
Interactor回调给Presenter的逻辑是在主线程执行,如果是子线程触发的回调,要切回主线程再刷新UI,你现在写的reloadTable方法已经做了主线程保护,这部分逻辑是对的 - 检查
TableViewCell的IBOutlet连线有没有断,避免赋值时控件是nil导致内容不显示
内容的提问来源于stack exchange,提问作者smack bot
相关产品推荐
相关产品推荐

