我在一个ViewController中并排获取两个集合视图时遇到了一些麻烦。
我的问题不在于构建或显示集合视图。单独地,我可以根据需要在屏幕上同时获取它们,而不是同时进行。
我调试了我的代码,发现它在设置'cellForItemAt'
时失败了我也在论坛上搜索并明白我需要一个if语句来说......
如果collectionView == 1,则将单元格A出列,否则将单元格B出列
不幸的是,当我去编写我的if语句时,xCode找不到我的集合视图,即不会自动找到它们,所以我可以编译。另外,我的单元格中有一个“未解析的标识符”。
鉴于我的努力,我已经碰壁了,并且想知道是否有人可以解释我的问题?感谢
viewDidLoad代码
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.isNavigationBarHidden = false
setupCollectionView()
}
collectionView创建代码
func setupCollectionView() {
let listLayout = UICollectionViewFlowLayout()
listLayout.itemSize = CGSize(width: 300, height: 40)
listLayout.minimumLineSpacing = 5
listLayout.sectionHeadersPinToVisibleBounds = true
let listFrame = CGRect(x: 0, y: 64, width: 325, height: 500)
let listView = UICollectionView(frame: listFrame, collectionViewLayout: listLayout)
// cell
listView.register(cellA.self, forCellWithReuseIdentifier: cellAId)
// header
listView.register(headerCellA.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerAID)
listView.delegate = self
listView.dataSource = self
listView.backgroundColor = .cyan
self.view.addSubview(listView)
let detailLayout = UICollectionViewFlowLayout()
detailLayout.itemSize = CGSize(width: 300, height: 40)
detailLayout.minimumLineSpacing = 5
detailLayout.sectionHeadersPinToVisibleBounds = true
let detailFrame = CGRect(x: 330, y: 64, width: 500, height: 650)
let detailView = UICollectionView(frame: detailFrame, collectionViewLayout: detailLayout)
// cell
detailView.register(cellB.self, forCellWithReuseIdentifier: cellBID)
// header
detailView.register(headerCellB.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerBID)
detailView.delegate = self
detailView.dataSource = self
detailView.backgroundColor = .white
self.view.addSubview(detailView)
}
cellForItemAt代码 - 无法使我的if语句生效
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if collectionView == detailView {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellAID, for: indexPath) as! ListCell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellBID, for: indexPath) as! DetailCell
}
return cell
}
答案 0 :(得分:1)
不幸的是,当我去编写我的if语句时,xCode找不到我的集合视图,即不会自动找到它们,所以我可以编译。另外,我的单元格中有一个“未解析的标识符”。
因为您尚未全局定义集合视图。您已在本地setupCollectionView
内定义了这些内容,这就是您无法在自动填充中找到它的原因。
答案 1 :(得分:1)
感谢所有评论的人。这已经通过创建我的简历作为全局懒惰变量闭包来解决。
这允许我在CV dataSource方法中访问它们,并为我的cellForItemAt指定不同的引用,允许在一个viewController中显示两个CV。
lazy var listCV: UICollectionView = {
let listLayout = UICollectionViewFlowLayout()
listLayout.itemSize = CGSize(width: 300, height: 40)
listLayout.minimumLineSpacing = 5
listLayout.sectionHeadersPinToVisibleBounds = true
let listFrame = CGRect(x: 0, y: 64, width: 325, height: 500)
let listView = UICollectionView(frame: listFrame, collectionViewLayout: listLayout)
listView.delegate = self
listView.dataSource = self
listView.backgroundColor = UIColor.cyan
return listView
}()
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if collectionView == listCV {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: listHeaderID, for: indexPath) as! HeaderCell
return header
} else { ...
}
}
答案 2 :(得分:0)
以下是您实现这一目标的方法。尝试像你一样对你的方法进行预测
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let collectionView = detailView as? CollectionViewB {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellAID, for: indexPath) as! ListCell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellBID, for: indexPath) as! DetailCell
}
return cell
}
只有在你有两个UICollectionView出口
时才能使用