Swift中使用@resultBuilder实现声明式UICollectionView时单元格为空如何解决?
问题根源
单元格内容为空的核心原因是你在列表单元格的注册逻辑中,完成内容配置后没有将配置对象赋值给单元格对应的属性,导致配置的文本、图片没有被渲染。
你在configureDataSource方法里的CellRegistration闭包中,创建了content配置对象并设置了image和text属性,但没有执行cell.contentConfiguration = content这一步,所有配置都没有生效。
修复方案
只需要修改configureDataSource方法中的CellRegistration闭包,补充配置赋值逻辑即可,修改后代码如下:
private func configureDataSource() { let cellRegistration = UICollectionView.CellRegistration<UICollectionViewListCell, ListItem> { (cell, indexPath, item) in var content = cell.defaultContentConfiguration() content.image = item.image content.text = item.title // 补充这一行即可修复内容不显示的问题 cell.contentConfiguration = content } data = UICollectionViewDiffableDataSource<Section, ListItem>(collectionView: self) { (collectionView: UICollectionView, indexPath: IndexPath, identifier: ListItem) -> UICollectionViewCell? in let cell = collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: identifier) cell.accessories = [.disclosureIndicator()] return cell } }
关于在UICollectionView内部定义dataSource的问题
完全可以,你当前的实现本身就是合法的:将DiffableDataSource作为自定义List子类的私有存储属性,符合封装原则,不需要额外调整。如果后续需要支持数据更新,你可以在List类中对外暴露更新快照的方法即可。
内容的提问来源于stack exchange,提问作者Niklas
相关产品推荐
相关产品推荐

