Swift 4中JSON数据无法显示在TableView单元格的问题求助
搞定TableView数据已加载但单元格为空的问题
我太懂你这种明明数据已经拿到手,可TableView就是显示空单元格的憋屈感了!别慌,咱们从最容易忽略的细节开始排查,大概率是某个小环节没踩对:
先确认TableView的基础配置有没有到位
- 检查dataSource和delegate是否绑定:不管是在Storyboard里把TableView的dataSource/delegate拖到ViewController,还是在代码里的
viewDidLoad里手动设置tableView.dataSource = self、tableView.delegate = self,这一步没做的话,TableView根本不知道该找谁要数据,自然是空的。 - 核对
numberOfRowsInSection的返回值:这个方法必须返回你数据源数组的count,比如你的数据源是var countries: [Country] = [],那得写return countries.count,要是写错成固定的0或者别的数,肯定看不到单元格内容。
自定义单元格的常见坑(如果你用了自定义cell)
- 复用标识符要完全匹配:在Storyboard/XIB里给自定义cell设置的复用ID,必须和
cellForRowAt里dequeueReusableCell用的标识符一模一样,比如你设的是"CountryCell",代码里就得写let cell = tableView.dequeueReusableCell(withIdentifier: "CountryCell", for: indexPath) as! CountryCell,标识符错了会拿到默认的空cell。 - IBOutlet关联是否有效:检查自定义cell里的UILabel等控件是不是已经和代码里的IBOutlet正确连上了——有时候拖拽的时候没拖到位,就算你给
cell.nameLabel.text赋值了,控件也接收不到。 - 纯代码自定义cell要初始化控件:如果是完全用代码写的cell,别忘了在
init(style:reuseIdentifier:)方法里把UI控件添加到contentView上,不然控件根本不存在,自然看不到内容。
数据刷新的时机和线程很关键
- 下载完数据后必须调用
tableView.reloadData(),而且一定要在主线程执行!网络请求都是在后台线程跑的,所以刷新UI的代码要包在DispatchQueue.main.async里:
要是忘了刷新,或者在后台线程刷新,TableView根本不知道数据已经更新了,还是保持原来的空状态。// 假设你已经成功解析出数据 self.countries = fetchedCountries // 回到主线程刷新TableView DispatchQueue.main.async { self.tableView.reloadData() }
最后再做几个小检查
- 确认数据源数组真的被填充了:调试的时候除了看数据下载成功,还要打印
countries.count或者直接查看数组元素,说不定是JSON解析的时候出了问题——比如你的模型是struct Country: Decodable { let name: String },但JSON里的key是"countryName",这时候得用CodingKeys做映射才能正确解析。 - 单元格高度是否合理:如果cell的高度被设成0,就算有内容也看不到。可以先在
heightForRowAt里返回固定值(比如return 44),或者开启自动布局自适应高度(记得设置TableView的estimatedRowHeight,再把rowHeight设为UITableView.automaticDimension)。
内容的提问来源于stack exchange,提问作者motivated
相关产品推荐
相关产品推荐

