如何将 collectionView 放在各自的 tableView 部分
How to placed collectionView in respective tableView Section
我有两个 collectionViews CollectionViewCell
和 CollectionViewCellButton
我想分别放在 tableView 的第一个和第二个 section
中。我正在通过设置断点来调试它。
这是我的 tableView.swift 文件 cellForRowAt indexPath
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0{
if let cell = tableView.dequeueReusableCell(withIdentifier: "tableviewcellid", for: indexPath) as? TableViewCell {
// Show SubCategory Title
(colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).headerButton.setTitle("View All",for: .normal)
cell.category.text = (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).category
cell.headerButton.setTitle("View All", for: .normal)
// Pass the data to colletionview inside the tableviewcell
// debugging...
let v1 = colorsArray.objectsArray[indexPath.section]
// what is v1?
print(type(of: v1))
guard let thisTableCellModel = v1 as? TableViewCellModel else {
fatalError("Expected a TableViewCellModel !!!")
}
let v3 = thisTableCellModel.colors[indexPath.row]
// what is v3?
print("123Array=",type(of: v3)) // this is an Array, not a CollectionViewCellModel
guard let rowArray = v3 as? [CollectionViewCellModel] else {
fatalError("Expected a [CollectionViewCellModel] !!!")
}
// if we get here, we have properly unwrapped
// an array of CollectionViewCellModel
// so, don't make it an Array of Array
//cell.updateCellWith(row: [rowArray])
print("rowArray1=",type(of: rowArray))
cell.updateCellWith(row: rowArray)
cell.selectionStyle = .none
return cell
}
}
else if indexPath.section == 1{
if let cell = tableView.dequeueReusableCell(withIdentifier: "tableviewcellid", for: indexPath) as? TableViewCell {
(colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).headerButton.setTitle("View All",for: .normal)
cell.category.text = (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).category
cell.headerButton.setTitle("View All", for: .normal)
// if let cell = ((colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).colors as! CollectionViewCellModelButton)
// debugging...
let v1 = colorsArray.objectsArray[indexPath.section]
// what is v1?
print(type(of: v1))
guard let thisTableCellModel = v1 as? TableViewCellModel else {
fatalError("Expected a TableViewCellModel !!!")
}
let v3 = thisTableCellModel.colors[indexPath.row]
// what is v3?
print("123ArraynotNotmodel=",type(of: v3)) // this is an Array, not a CollectionViewCellModel
guard let rowArray = v3 as? [CollectionViewCellModelButton] else {
fatalError("Expected a [CollectionViewCellModelButton] !!!")
}
print("rowArray2=",type(of: rowArray))
cell.updateCellWith(row: rowArray) //break point
}
}
return UITableViewCell()
}
这是在每个 section
tableView
中调用的 updateCellWith
方法
func updateCellWith(row: [CollectionViewModel]) {
self.rowWithColors = row
self.collectionView.reloadData()
}
这是 TableViewCell.Swift 文件,其中包含 cellForItemAt indexPath
的 collectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.section == 0
{
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellid", for: indexPath) as? CollectionViewCell {
// cell.imageView = UIImage(named: (rowWithColors?[indexPath.item].image)! )
// CollectionViewCellModel
/// [CollectionViewCellModelButton
print("index1=",indexPath.section)
cell.imageView.image = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).imageView
cell.dicountAmountLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).dicountAmountLabel
cell.dicountLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).dicountLabel
cell.customerTypeLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).customerTypeLabel
cell.dicountAmountLabel.textColor = .white
cell.dicountLabel.textColor = .white
cell.customerTypeLabel.textColor = .white
return cell
}
}
else if indexPath.section == 1
{
print("index2=",indexPath.section)
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellButtonid", for: indexPath) as? CollectionViewCellButton {
// cell.imageView = UIImage(named: (rowWithColors2?[indexPath.item].image)! )
//if let model = self.rowWithColors?[indexPath.item] as? CollectionViewCellModelButton {
//model.collectionButton.setTitle(model.collectionButton, for: .normal)
//cell.collectionButton.titleLabel?.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModelButton).collectionButton.setTitle("Hi", for: .normal)
cell.collectionButton.setTitle("Hi", for: .normal)
//
return cell
}
}
return UICollectionViewCell()
}
在cell.updateCellWith(row: rowArray)
中设置断点在indexPath.section == 1
of cellForRowAt indexPath
of tableView.The调试器不进入collectionView函数indexPath.section == 1
cellForItemAt indexPath
它重新访问 indexPath.section == 0
的 collectionView 只是为了 section 0 and 1
的 tableView cellForRowAt indexPath
进入indexPath.section == 0
的collectionView函数cellForItemAt indexPath
给运行时间error.How我可以做到运行section 1
的collectionView tableView.How 的 section 1
上的函数在 View 上显示两个 CollectionView ?就像这个图
您可以从此 google drive link 运行 下载代码以进行更好的可视化,看看需要什么
您的代码中存在多个问题,回答或修复所有问题确实不在所提问题的范围内,
我只关注崩溃:
您的代码存在强制类型转换问题。错误很明显
显然你持有 CollectionViewModel
的数组(这是一个协议)并且有两个不同的 类 证实了这个协议 CollectionViewCellModel
和 CollectionViewCellModelButton
并且您使用
盲目地将这两种类型强制转换为 CollectionViewCellModel
(self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).imageView
因此崩溃。
有什么问题?
太多了,我会指出一些与此相关的内容。 TableViewCell
中的 collectionView
总是收到 CollectionViewCellModel
或 CollectionViewCellModelButton
的数组(一维数组)
在您的代码中,您将部分数硬编码为 1
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
但奇怪的是,在您的 cellForItemAt indexPath
中,您开始检查 indexPath.section == 0
或 indexPath.section == 1
,如果您的部分数被硬编码为 1,indexPath.section
怎么会是 1?
更奇怪的是,您尝试根据 indexPath.section
对数组 rowWithColors
中的元素进行类型转换
在您的代码中,您输入 (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel)
if indexPath.section == 0
和 self.rowWithColors?[indexPath.item] as! CollectionViewCellModelButton
if indexPath.section == 1
你需要什么?
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let collectionViewCellModel = self.rowWithColors?[indexPath.row] as? CollectionViewCellModel,
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellid", for: indexPath) as? CollectionViewCell {
cell.imageView.image = collectionViewCellModel.imageView
cell.dicountAmountLabel.text = collectionViewCellModel.dicountAmountLabel
cell.dicountLabel.text = collectionViewCellModel.dicountLabel
cell.customerTypeLabel.text = collectionViewCellModel.customerTypeLabel
cell.dicountAmountLabel.textColor = .white
cell.dicountLabel.textColor = .white
cell.customerTypeLabel.textColor = .white
return cell
}
if let collectionViewCellModelButton = self.rowWithColors?[indexPath.row] as? CollectionViewCellModelButton,
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellButtonid", for: indexPath) as? CollectionViewCellButton
{
//customise `CollectionViewCellButton` here with `collectionViewCellModelButton` data
return cell
}
return UICollectionViewCell()
}
O/P:
提示:
不确定为什么您在同一个文件中再次使用错误签名的 cellForItemAtIndexPath
,它没有被调用是件好事,但这让我想知道为什么?我的建议,删除它:)
我有两个 collectionViews CollectionViewCell
和 CollectionViewCellButton
我想分别放在 tableView 的第一个和第二个 section
中。我正在通过设置断点来调试它。
这是我的 tableView.swift 文件 cellForRowAt indexPath
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0{
if let cell = tableView.dequeueReusableCell(withIdentifier: "tableviewcellid", for: indexPath) as? TableViewCell {
// Show SubCategory Title
(colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).headerButton.setTitle("View All",for: .normal)
cell.category.text = (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).category
cell.headerButton.setTitle("View All", for: .normal)
// Pass the data to colletionview inside the tableviewcell
// debugging...
let v1 = colorsArray.objectsArray[indexPath.section]
// what is v1?
print(type(of: v1))
guard let thisTableCellModel = v1 as? TableViewCellModel else {
fatalError("Expected a TableViewCellModel !!!")
}
let v3 = thisTableCellModel.colors[indexPath.row]
// what is v3?
print("123Array=",type(of: v3)) // this is an Array, not a CollectionViewCellModel
guard let rowArray = v3 as? [CollectionViewCellModel] else {
fatalError("Expected a [CollectionViewCellModel] !!!")
}
// if we get here, we have properly unwrapped
// an array of CollectionViewCellModel
// so, don't make it an Array of Array
//cell.updateCellWith(row: [rowArray])
print("rowArray1=",type(of: rowArray))
cell.updateCellWith(row: rowArray)
cell.selectionStyle = .none
return cell
}
}
else if indexPath.section == 1{
if let cell = tableView.dequeueReusableCell(withIdentifier: "tableviewcellid", for: indexPath) as? TableViewCell {
(colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).headerButton.setTitle("View All",for: .normal)
cell.category.text = (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).category
cell.headerButton.setTitle("View All", for: .normal)
// if let cell = ((colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).colors as! CollectionViewCellModelButton)
// debugging...
let v1 = colorsArray.objectsArray[indexPath.section]
// what is v1?
print(type(of: v1))
guard let thisTableCellModel = v1 as? TableViewCellModel else {
fatalError("Expected a TableViewCellModel !!!")
}
let v3 = thisTableCellModel.colors[indexPath.row]
// what is v3?
print("123ArraynotNotmodel=",type(of: v3)) // this is an Array, not a CollectionViewCellModel
guard let rowArray = v3 as? [CollectionViewCellModelButton] else {
fatalError("Expected a [CollectionViewCellModelButton] !!!")
}
print("rowArray2=",type(of: rowArray))
cell.updateCellWith(row: rowArray) //break point
}
}
return UITableViewCell()
}
这是在每个 section
tableView
updateCellWith
方法
func updateCellWith(row: [CollectionViewModel]) {
self.rowWithColors = row
self.collectionView.reloadData()
}
这是 TableViewCell.Swift 文件,其中包含 cellForItemAt indexPath
的 collectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.section == 0
{
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellid", for: indexPath) as? CollectionViewCell {
// cell.imageView = UIImage(named: (rowWithColors?[indexPath.item].image)! )
// CollectionViewCellModel
/// [CollectionViewCellModelButton
print("index1=",indexPath.section)
cell.imageView.image = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).imageView
cell.dicountAmountLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).dicountAmountLabel
cell.dicountLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).dicountLabel
cell.customerTypeLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).customerTypeLabel
cell.dicountAmountLabel.textColor = .white
cell.dicountLabel.textColor = .white
cell.customerTypeLabel.textColor = .white
return cell
}
}
else if indexPath.section == 1
{
print("index2=",indexPath.section)
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellButtonid", for: indexPath) as? CollectionViewCellButton {
// cell.imageView = UIImage(named: (rowWithColors2?[indexPath.item].image)! )
//if let model = self.rowWithColors?[indexPath.item] as? CollectionViewCellModelButton {
//model.collectionButton.setTitle(model.collectionButton, for: .normal)
//cell.collectionButton.titleLabel?.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModelButton).collectionButton.setTitle("Hi", for: .normal)
cell.collectionButton.setTitle("Hi", for: .normal)
//
return cell
}
}
return UICollectionViewCell()
}
在cell.updateCellWith(row: rowArray)
中设置断点在indexPath.section == 1
of cellForRowAt indexPath
of tableView.The调试器不进入collectionView函数indexPath.section == 1
cellForItemAt indexPath
它重新访问 indexPath.section == 0
的 collectionView 只是为了 section 0 and 1
的 tableView cellForRowAt indexPath
进入indexPath.section == 0
的collectionView函数cellForItemAt indexPath
给运行时间error.How我可以做到运行section 1
的collectionView tableView.How 的 section 1
上的函数在 View 上显示两个 CollectionView ?就像这个图
您可以从此 google drive link 运行 下载代码以进行更好的可视化,看看需要什么
您的代码中存在多个问题,回答或修复所有问题确实不在所提问题的范围内, 我只关注崩溃:
您的代码存在强制类型转换问题。错误很明显
显然你持有 CollectionViewModel
的数组(这是一个协议)并且有两个不同的 类 证实了这个协议 CollectionViewCellModel
和 CollectionViewCellModelButton
并且您使用
盲目地将这两种类型强制转换为CollectionViewCellModel
(self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).imageView
因此崩溃。
有什么问题?
太多了,我会指出一些与此相关的内容。 TableViewCell
中的 collectionView
总是收到 CollectionViewCellModel
或 CollectionViewCellModelButton
的数组(一维数组)
在您的代码中,您将部分数硬编码为 1
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
但奇怪的是,在您的 cellForItemAt indexPath
中,您开始检查 indexPath.section == 0
或 indexPath.section == 1
,如果您的部分数被硬编码为 1,indexPath.section
怎么会是 1?
更奇怪的是,您尝试根据 indexPath.section
对数组 rowWithColors
中的元素进行类型转换
在您的代码中,您输入 (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel)
if indexPath.section == 0
和 self.rowWithColors?[indexPath.item] as! CollectionViewCellModelButton
if indexPath.section == 1
你需要什么?
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let collectionViewCellModel = self.rowWithColors?[indexPath.row] as? CollectionViewCellModel,
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellid", for: indexPath) as? CollectionViewCell {
cell.imageView.image = collectionViewCellModel.imageView
cell.dicountAmountLabel.text = collectionViewCellModel.dicountAmountLabel
cell.dicountLabel.text = collectionViewCellModel.dicountLabel
cell.customerTypeLabel.text = collectionViewCellModel.customerTypeLabel
cell.dicountAmountLabel.textColor = .white
cell.dicountLabel.textColor = .white
cell.customerTypeLabel.textColor = .white
return cell
}
if let collectionViewCellModelButton = self.rowWithColors?[indexPath.row] as? CollectionViewCellModelButton,
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellButtonid", for: indexPath) as? CollectionViewCellButton
{
//customise `CollectionViewCellButton` here with `collectionViewCellModelButton` data
return cell
}
return UICollectionViewCell()
}
O/P:
提示:
不确定为什么您在同一个文件中再次使用错误签名的 cellForItemAtIndexPath
,它没有被调用是件好事,但这让我想知道为什么?我的建议,删除它:)