如何通过代码创建UICollectionView并添加至ViewController?实现遇阻求助
解决UICollectionView无法正常显示的问题
嘿,我帮你梳理下这段代码里的几个关键问题,这些就是导致你的UICollectionView没成功显示的核心原因:
1. 使用了抽象布局基类
UICollectionViewLayout是抽象类,不能直接实例化使用,你得用具体的布局实现,比如最常用的UICollectionViewFlowLayout,还能顺便配置item大小、间距等属性:
let layout = UICollectionViewFlowLayout() layout.itemSize = CGSize(width: 100, height: 100) layout.minimumInteritemSpacing = 10 layout.minimumLineSpacing = 10
2. 注册Cell的代码不完整
你的cv.register(UICollectionViewCell...没写完,得完整调用注册方法。如果用系统默认Cell,写法如下:
cv.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)
如果是自定义Cell,把UICollectionViewCell.self换成你的自定义Cell类即可。
3. 未将CollectionView添加到视图并设置约束
你只创建了CollectionView,但没把它添加到ViewController的view上,也没设置布局约束。在创建完CollectionView后,需要补充这些步骤:
cv.translatesAutoresizingMaskIntoConstraints = false view.addSubview(cv) // 设置约束让它铺满整个视图(或你需要的区域) NSLayoutConstraint.activate([ cv.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), cv.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), cv.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), cv.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ])
4. 未实现DataSource的必填方法
UICollectionView必须实现UICollectionViewDataSource的两个核心方法,不然不会显示任何内容:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 20 // 返回你要显示的item数量 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) cell.backgroundColor = .systemBlue // 设置背景色方便看到效果 return cell }
完整修正后的代码
import UIKit class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { private let cellId = "cellId" lazy var collectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() layout.itemSize = CGSize(width: 100, height: 100) layout.minimumInteritemSpacing = 10 layout.minimumLineSpacing = 10 let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) cv.dataSource = self cv.delegate = self cv.backgroundColor = .white cv.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId) cv.translatesAutoresizingMaskIntoConstraints = false return cv }() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .lightGray setupCollectionView() } private func setupCollectionView() { view.addSubview(collectionView) NSLayoutConstraint.activate([ collectionView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), collectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ]) } // MARK: - UICollectionViewDataSource func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 20 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) cell.backgroundColor = .systemBlue cell.layer.cornerRadius = 8 return cell } }
替换成这段代码后,你应该就能看到正常显示的UICollectionView啦~
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

