如何实现从主UICollectionView向嵌套UICollectionView传递数据
实现嵌套UICollectionView加载Question数据的完整方案
我来帮你搞定这个嵌套CollectionView的需求,按照你的要求一步步实现就好😉
一、先搞定外层Main CollectionView的数据源
首先确保你的mainUICollectionView已经在ViewController里设置好数据源和代理(直接让ViewController实现UICollectionViewDataSource和UICollectionViewDelegate就行),然后直接用questions.count来决定单元格数量:
// 在你的ViewController扩展里实现数据源方法 extension ViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { // 直接返回questions数组的元素个数,外层CollectionView会生成对应数量的单元格 return questions.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // 取出自定义的mainUICollectionViewCell let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "mainUICollectionViewCell", for: indexPath) as! mainUICollectionViewCell // 把当前位置的Question数据传给单元格 let currentQuestion = questions[indexPath.item] cell.setup(with: currentQuestion) return cell } }
二、处理嵌套单元格的内部逻辑
接下来重点处理mainUICollectionViewCell,这里要注意:嵌套的nestedUICollectionView的数据源和代理最好直接放在cell内部实现,别跟外层的CollectionView共用代理,不然很容易搞混索引。
先给cell加一个配置方法,用来接收Question数据,同时设置nestedLabel和嵌套CollectionView:
class mainUICollectionViewCell: UICollectionViewCell { // 假设你已经通过Storyboard或者代码关联了这些控件 @IBOutlet weak var nestedUILabel: UILabel! @IBOutlet weak var nestedUICollectionView: UICollectionView! // 存当前cell对应的Question数据,方便后续嵌套CollectionView使用 private var currentQuestion: Question? override func awakeFromNib() { super.awakeFromNib() // 给嵌套CollectionView绑定数据源和代理到当前cell nestedUICollectionView.dataSource = self nestedUICollectionView.delegate = self // 注册嵌套的cell(如果是代码注册的话,Storyboard注册的话可以跳过) nestedUICollectionView.register(nestedUICollectionViewCell.self, forCellWithReuseIdentifier: "nestedCell") } // 对外暴露的配置方法,外层ViewController调用这个传数据 func setup(with question: Question) { self.currentQuestion = question // 这里直接把Question的title赋值给nestedUILabel nestedUILabel.text = question.title // 刷新嵌套的CollectionView,确保数据更新 nestedUICollectionView.reloadData() } } // 实现嵌套CollectionView的数据源和代理 extension mainUICollectionViewCell: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { // 返回当前Question里string数组的元素个数,没有的话返回0 return currentQuestion?.stringArray.count ?? 0 // 注意:改成你Question类里实际的string数组属性名! } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "nestedCell", for: indexPath) as! nestedUICollectionViewCell // 给嵌套的cell设置文本,取string数组里的对应元素 if let text = currentQuestion?.stringArray[indexPath.item] { // 假设nestedUICollectionViewCell里有个叫contentLabel的UILabel用来显示内容 cell.contentLabel.text = text } return cell } // 可选:给嵌套的cell设置大小,根据你的需求调整 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: 100, height: 35) } }
三、几个要注意的小细节
- 所有CollectionViewCell都要正确注册:要么在Storyboard里设置好Reuse Identifier,要么用代码注册
- 嵌套CollectionView的数据源一定要绑定到cell内部:别跟外层共用代理,不然会出现索引错乱的问题
- 调用
setup(with:)之后一定要刷新嵌套CollectionView,不然数据不会更新 - 记得把代码里的
stringArray改成你Question类里实际的string数组属性名哦!
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

