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

时间:2019-05-24 00:24:50

标签: ios swift uitableview uicollectionview

我的处境很复杂,需要您的帮助以找出应该怎么做。

我有一个原型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"]

现在,我试图在这些TableView和collectionView之间建立连接

首先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用蓝色数组填充,最后一个是正确的,用绿色数组填充。

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

2 个答案:

答案 0 :(得分:0)

当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])

答案 1 :(得分:0)

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

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

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

-在CollectionView的cellForItemAt委托中为每个tableView分配值到您的数据源。

-将所有tableViewDelegates写入collectionViewCell内,并使用CollectionViewCell的数据源变量填充tableView。

关键是要了解tableView在CollectionViewCell内部,因此,您的CollectionViewCell负责创建tableView。

@Sh_Khan 给出的CollectionViewCell结构看起来很好(因此不要放置相似的代码)。