3个视图控制器上的集合视图

时间:2017-12-09 10:26:29

标签: ios swift uicollectionview tableview uicollectionviewcell

我在1个视图控制器上有3个集合视图。我已经尝试了一些我在Stack上找到的其他建议,但似乎没有任何效果。

所有3个集合视图都位于HomeTableViewController的单独单元格中。我尝试创建HomeTableViewController的插座连接,但是我收到错误Outlets cannot be connected to repeating content

我读过许多人能够连接他们的多个集合视图,所以我对我出错的地方感到有点困惑......

4 个答案:

答案 0 :(得分:1)

UICollectionView个实例无法与单独的IBOutlet中的UITableViewController属性相关联。

正如您所描述的那样,UICollectionView实际上是他们父亲UITableViewCell的每个孩子,因此不是UITableViewController的直接后代。这是因为单元格将在运行时添加到UITableView

如果你打算在HomeTableViewController内创建出口,我会建议像这样创建它们:

private weak var collectionViewA: UICollectionView?

并覆盖cellForRow,如此:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = super.tableView(tableView, cellForRowAt: indexPath)
    // cast cell as collection view parent
    collectionViewA = cell.collectionView
    return cell
}

正如已经提到的,更好的解决方案是从他们自己的UICollectionView父母中管理UITableViewCell个实例。例如:

final class CollectionViewAParentTableViewCell: UITableViewCell {
    @IBOutlet private weak var collectionView: UICollectionView!
}
extension CollectionViewAParentTableViewCell: UICollectionViewDataSource {
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        …
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        …
    }
}

答案 1 :(得分:0)

您应该在UITableViewCell中创建插座。然后你可以为tableView中的每个单元格中的collectionViews提供标签:cellForRowAtIndexPath方法:

yourCell.collectionViewOutlet.tag = indexPath.row + 1000

如果标签与其他视图的标签冲突,则应使用Any Constant Integer替换1000.

然后使用这些标记来区分collectionview中的所有集合视图:cellForItemForIndexpath方法:

if(collectionView.tag == 1000){
//Code for collection view in first row of the table
}
else if(collectionView.tag == 1001){
//Code for collection view in second row of the table
}
else if(collectionView.tag == 1002){
//Code for collection view in third row of the table
}

您还应该记住,像上面一样返回每个集合视图的项目数。

标签让生活变得更轻松,不是吗? 快乐编码(Y)

答案 2 :(得分:0)

您应该在UITableViewCell中创建插座。然后你可以为tableView中的每个单元格中的collectionViews提供标签:cellForRowAtIndexPath方法:

yourCell.collectionViewOutlet.tag = indexPath.row + 1000

如果标签与其他视图的标签冲突,则应使用Any Constant Integer替换1000.

然后使用这些标记来区分collectionview中的所有集合视图:cellForItemForIndexpath方法:

if(collectionView.tag == 1000){
//Code for collection view in first row of the table
}
else if(collectionView.tag == 1001){
//Code for collection view in second row of the table
}
else if(collectionView.tag == 1002){
//Code for collection view in third row of the table
}

您还应该记住,像上面一样,为每个集合视图返回collectionView:numberOfItemsInSection中的项目数。

标签让生活变得更轻松,不是吗? 快乐编码(Y)

答案 3 :(得分:0)

使用不同的集合视图单元格创建三个不同的集合视图,然后在您需要添加如下所示的dataSource方法之后: -

if collectionView == collectionViewA{

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellA", for: indexPath) as! collectionCell

        return cell
    }else if collectionView == collectionViewB{

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellB", for: indexPath) as! collectionCell

        return cell
    }else if collectionView == collectionViewC{

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellC", for: indexPath) as! collectionCell

        return cell
    }else{
        return UICOllectionViewCell()
}

也对其他dataSource方法执行相同的操作。