UICollectionView显示空白、不展示任何单元格问题排查求助
问题原因及修复方案
核心错误
- 你没有给
UICollectionView指定有效的UICollectionViewFlowLayout布局对象,UICollectionViewDelegateFlowLayout的尺寸设置方法只有当集合视图的布局为FlowLayout类型时才会生效,缺少正确布局会导致所有cell无法正常渲染显示。 - 如果你是纯代码创建
FeedController实例,使用默认的init()方法初始化UICollectionViewController不会自动创建FlowLayout,需要主动传入布局参数。
修复步骤
步骤1:配置UI时指定布局
在configureUI方法中补充设置collectionView的布局:
func configureUI() { // 新增布局配置 if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { layout.estimatedItemSize = .zero // 关闭自动估算尺寸,使用自定义size } else { let flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .vertical collectionView.collectionViewLayout = flowLayout } collectionView.backgroundColor = .white collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) }
步骤2:纯代码创建控制器时使用带布局的构造器
如果是代码初始化FeedController,不要用FeedController(),改为:
let layout = UICollectionViewFlowLayout() layout.scrollDirection = .vertical let feedVC = FeedController(collectionViewLayout: layout)
可选优化
UICollectionViewController子类默认已经把dataSource和delegate设置为自身,你在viewDidLoad里写的collectionView.dataSource = self、collectionView.delegate = self以及手动调用的reloadData都属于冗余代码,可以直接删除。
修正后完整可运行代码
import UIKit private let reuseIdentifier = "Cell" class FeedController: UICollectionViewController { //MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() configureUI() } //MARK: - Helpers func configureUI() { // 配置布局 if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { layout.estimatedItemSize = .zero } else { let flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .vertical collectionView.collectionViewLayout = flowLayout } collectionView.backgroundColor = .white collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) } } //MARK:- UICollectionViewDataSource extension FeedController { override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 5 } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) cell.backgroundColor = .systemRed return cell } } extension FeedController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: view.frame.width, height: 200) } // 可选:设置cell间距为0,避免默认边距导致的显示问题 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 0 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return .zero } }
内容的提问来源于stack exchange,提问作者Looney Tunes
相关产品推荐
相关产品推荐

