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),或者明确指定服务器端口,否则请求会失败。
最后验证步骤
按照上面的点修正后,建议你:
- 在
doPostProdutos的请求成功回调里,打印listaProdutos.count,确认数据确实被正确填充。 - 在
collectionView(_:numberOfItemsInSection:)方法里添加打印语句,确认这个方法被调用且返回了正确的数量。
这样应该就能解决UICollectionView不显示数据的问题了。
内容的提问来源于stack exchange,提问作者Donadon

