我的处境很复杂,需要您的帮助以找出应该怎么做。
我有一个原型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用蓝色数组填充,最后一个是正确的,用绿色数组填充。
如果您能帮助我,我将不胜感激。
答案 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结构看起来很好(因此不要放置相似的代码)。