一个 ViewController 中的多个 CollectionView
Posted
技术标签:
【中文标题】一个 ViewController 中的多个 CollectionView【英文标题】:Multiple CollectionViews in one ViewController 【发布时间】:2020-08-28 15:58:48 【问题描述】:我尝试在一个 ViewController 中显示多个集合视图,但我因错误而崩溃:
Thread 1: Exception: "could not dequeue a view of kind: UICollectionElementKindCell with identifier MainCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard"
我在 Storyboard 中注册了所有单元格,这是我的 ViewController 代码:
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var horizontalNumbers: UICollectionView!
@IBOutlet weak var verticalNumbers: UICollectionView!
override func viewDidLoad()
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
horizontalNumbers.delegate = self
horizontalNumbers.dataSource = self
verticalNumbers.delegate = self
verticalNumbers.dataSource = self
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
if collectionView == collectionView
return 81
else
return 9
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
if collectionView == collectionView
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MainCell", for: indexPath) as! CollectionViewCell
cell.backgroundColor = .systemGreen
return cell
else if collectionView == horizontalNumbers
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Horizontal", for: indexPath) as! HorizontalNumbersCell
return cell
else
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Vertical", for: indexPath) as! VerticalNumbersCell
return cell
我检查了所有内容并查找了一些代码示例,但没有公布我崩溃的原因。
【问题讨论】:
【参考方案1】:您需要为所有三个collectionView注册单元格。以collectionView
为例。
试试
collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "MainCell") // if it is loaded in nib, and nib name is CollectionViewCell
或
collectionView.register(CollectionViewCell.self, forCellWithReuseIdentifier: "MainCell") // if it is written just in code
在viewDidLoad
。
对horizontalNumbers
等做同样的事情。
查看https://developer.apple.com/documentation/uikit/uicollectionview/1618089-register了解更多详情。
【讨论】:
我添加到 viewdidload: collectionView.register(CollectionViewCell.self, forCellWithReuseIdentifier: "MainCell") HorizontalNumbers.register(VerticalNumbersCell.self, forCellWithReuseIdentifier: "Horizontal") verticalNumbers.register(HorizontalNumbersCell.self, forCellWithReuseIdentifier :“垂直”),但无论如何都会因错误而崩溃:线程 1:异常:“无法使类型视图出列:带有标识符 MainCell 的 UICollectionElementKindCell - 必须为标识符注册一个 nib 或一个类或连接故事板中的原型单元" 那我建议你在 Github 上上传你的项目。根据我自己的经验,我无法仅通过您发布的代码来判断发生了什么。以上是关于一个 ViewController 中的多个 CollectionView的主要内容,如果未能解决你的问题,请参考以下文章
返回上一个 ViewController 不适用于 Swift 中的多个视图控制器
使用多个 ViewController、Xcode 将代码连接到情节提要中的 UI
如何从一个 viewController 添加多个 segue
一个 Viewcontroller 中的多个 collectionview 导致 Index out of range 错误