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

UICollectionView加载服务器数据后不显示问题求助

问题排查与修复方案

我帮你梳理一下代码里可能导致UICollectionView不显示数据的几个关键点:

1. 集合视图的数据源/代理未正确绑定

你在ViewController里实现了UICollectionViewDataSource和UICollectionViewDelegate协议,但有两种可能导致协议方法没被触发:

  • Storyboard/XIB未连接:检查你的colData控件在Storyboard中,是否已经将dataSource和delegate拖拽连接到当前ViewController。
  • 代码未手动设置:如果Storyboard没做连接,需要在viewDidLoad里手动添加绑定代码:
override func viewDidLoad() {
    super.viewDidLoad()
    // 新增这两行绑定代码
    colData.dataSource = self
    colData.delegate = self
    self.doPostProdutos()
    lbDescricao.text = self.desc
    print( self.listaProdutos )
}

如果代理没绑定,就算调用reloadData(),集合视图也不会触发数据源方法去加载数据。

2. 请求体格式与Content-Type不匹配

你在POST请求里设置了Content-Type为application/x-www-form-urlencoded,但用JSONSerialization生成了JSON格式的请求体,这两者是不兼容的:

// 错误的格式组合
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let httpBody = try? JSONSerialization.data(withJSONObject: parameter, options: [])
request.httpBody = httpBody

如果服务器期望表单格式,需要把参数转换成key=value的格式:

// 修正为表单格式的请求体
let parameter = ["categoria": String(self.codigoCategoria)]
let queryItems = parameter.map { URLQueryItem(name: $0.key, value: $0.value) }
var components = URLComponents()
components.queryItems = queryItems
request.httpBody = components.query?.data(using: .utf8)

如果服务器确实期望JSON格式,那应该把Content-Type改成application/json:

request.setValue("application/json", forHTTPHeaderField: "Content-Type")

这个问题可能导致服务器无法解析参数,虽然你说数据已填充,但还是要确认格式匹配,避免后续出现异常。

3. 初始状态下listaProdutos为nil的潜在问题

你定义listaProdutos为隐式可选数组:var listaProdutos: Array<Produto>!,初始值是nil。当集合视图第一次加载时,numberOfItemsInSection会调用listaProdutos.count,这会直接触发崩溃(nil不能调用count方法)。

建议初始化一个空数组,而非依赖隐式可选:

// 改成非可选的空数组
var listaProdutos: [Produto] = []

这样即使请求还没返回,集合视图也会返回0个条目,不会崩溃,等请求成功后调用reloadData()就能正常显示数据。

4. 无用的reloadItems调用

在请求成功后,你调用了self.colData.reloadItems(at: self.items),但self.items是空数组(只有用户点击集合视图条目时才会添加内容),所以这个调用没有任何作用,可以直接删掉,只保留self.colData.reloadData()就够了。

5. 模拟器访问localhost的问题

如果你在iOS模拟器上测试,localhost指向的是模拟器本身,而非你的电脑服务器。需要把URL改成电脑的局域网IP(比如http://192.168.x.x/adm/api/produtos/produtosCategoria.php),或者明确指定服务器端口,否则请求会失败。

最后验证步骤

按照上面的点修正后,建议你:

  1. 在doPostProdutos的请求成功回调里,打印listaProdutos.count,确认数据确实被正确填充。
  2. 在collectionView(_:numberOfItemsInSection:)方法里添加打印语句,确认这个方法被调用且返回了正确的数量。

这样应该就能解决UICollectionView不显示数据的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:49:02