以编程方式创建多个CollectionView

时间:2017-07-24 02:41:18

标签: ios swift uicollectionview

我在一个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
}

3 个答案:

答案 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出口

时才能使用
  • 另一个调整是你可以在你的xib上拖放两个UIView 然后加载两个UIViewController类,每个都有单独的 UICollectionView对象。无论你最好的方法是先找出实施方式。只是想对它有所了解。