我在1个视图控制器上有3个集合视图。我已经尝试了一些我在Stack上找到的其他建议,但似乎没有任何效果。
所有3个集合视图都位于HomeTableViewController的单独单元格中。我尝试创建HomeTableViewController的插座连接,但是我收到错误Outlets cannot be connected to repeating content
。
我读过许多人能够连接他们的多个集合视图,所以我对我出错的地方感到有点困惑......
答案 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方法执行相同的操作。