在不同的collectionView单元格中填充不同的tableViews

Posted

技术标签:

【中文标题】在不同的collectionView单元格中填充不同的tableViews【英文标题】:Fill different tableViews inside the different collectionView cell 【发布时间】:2019-05-24 00:24:49 【问题描述】:

我的情况很复杂,我需要你的帮助来弄清楚我应该怎么做。

我有一个原型UIcollectionView,这个原型应该为每种样式类型创建4次。 我将这些样式类型定义为枚举:

enum Colors 
    case black, blue, red, green


var color = Colors.black

CollectionViewCell 内部,我还有一个tableView,它有一个包含标签的原型。并且有四个数组TableViews 应该被这些数组填充:

var black = ["black1","black2","black3"]
var blue = ["blue1","blue2","blue3"]
var red = ["red1","red2","red3"]
var green = ["green1","green2","green3"]

现在,我尝试在这些 TableViews 和 collectionViews 之间建立联系

UICollectionView第一

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
switch indexPath.row 
case 0,1,2,3:
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "colors", for: indexPath) as? colorsCell 

        switch indexPath.row 
        case 1:
            self.color = .black
        case 2:
            self.color = .blue
        case 3:
            self.color = .red
        case 4:
            self.color = .green
        default:
            break
        

        return cell
    
default:
    break

return UICollectionViewCell()

那么,对于TableView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    switch indexPath.row 
    case 0,1,2,3:
        if let cell = tableView.dequeueReusableCell(withIdentifier: "colCell", for: indexPath) as? colCellDashboard 
            switch self.color 
            case .black:
                cell.title.text = black[indexPath.row]
            case .blue:
                cell.title.text = blue[indexPath.row]
            case .red:
                cell.title.text = red[indexPath.row]
            case .green:
                cell.title.text = green[indexPath.row]
            
            return cell
        
    return UITableViewCell()

结果不够好,前三个collectionview中的前三个tableview用蓝色数组填充,最后一个正确用绿色数组填充。

如果您能帮助我,我将不胜感激。

【问题讨论】:

【参考方案1】:

当 tableView 嵌套在你应该使用的集合中时

class CollectionCell:UICollectionViewCell,UITableViewDelegate,UITableViewDataSource 

   var tableArr = [String]() // table dataSource array

   func configure(_ res:[String]) 
      tableArr = arr
      self.tableView.reloadData()
    

  ///////
  here implement the cellForRowAt and numberOfRows for the nested tableView


在包含 collectionView 的 vc 中,像这样声明数组

let arr =  [["black1","black2","black3"] , ["blue1","blue2","blue3"] , 
             ["red1","red2","red3"] ,  ["green1","green2","green3"]]

然后在cellForItemAt里面

 if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "colors", for: indexPath) as? colorsCell 
 cell.configure(arr[indexPath.row])

【讨论】:

【参考方案2】:

啊,您的代码的问题是在您的集合视图的cellForItemAt 委托方法中,您将颜色分配给类变量self.color。这将在每次调用代理时被覆盖。因此,当调用 tableview 的 cellForRowAt 委托时,它将具有 self.color 的覆盖值(无论是最新的值),因此您会在表中看到意外的条目。

在collectionViews 中有tableviews 是一个常见的问题。最简单的解决方法是:

-将tableview的数据源放在collectionViewCell中。(在UICollectionViewCell子类中创建一个变量。)

-为 CollectionView 的 cellForItemAt 委托中的每个 tableView 分配值。

-在collectionViewCell中写入所有tableViewDelegates,并使用CollectionViewCell的datasource变量填充tableView。

关键是要明白tableView在CollectionViewCell里面,因此你的CollectionViewCell负责创建tableView。

@Sh_Khan 给出的 CollectionViewCell 结构看起来不错(所以不要放类似的代码)。

【讨论】:

以上是关于在不同的collectionView单元格中填充不同的tableViews的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 collectionview 单元格中填充图像而不会闪烁

collectionview 单元格中的阴影与 swift 中的其他单元格的行为方式不同

在 collectionView 的两个不同单元格中显示 highchart 和 swiftDataTable

TableView 中的 UICollectionView 不填充单元格?

多个tableView单元格中的多个collectionView

如何将操作按钮添加到 collectionView 的部分单元格中?