我有一个UITableView
,其中有一个UICollectionView
和
我使用numberOfRowsInSection
来设置行数,并使用cellForRowAt
来显示标题为
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return sectionsArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let strname = sectionsArray[indexPath.row]
if (strname as AnyObject).isEqual(to: "top"){
tableCellobj = tableView.dequeueReusableCell(withIdentifier: "cellmiddle", for: indexPath) as! TableCellMiddle
tableCellobj.lblMiddle.text = "\(strname)"
return tableCellobj
}
if (strname as AnyObject).isEqual(to: "bottom") {
tableCellobj = tableView.dequeueReusableCell(withIdentifier: "cellmiddle", for: indexPath) as! TableCellMiddle
tableCellobj.lblMiddle.text = "\(strname)"
return tableCellobj
}
正如您所见,数组sectionsArray
是:
var sectionsArray: NSMutableArray = NSMutableArray()
sectionsArray.add("top")
sectionsArray.add("bottom")
现在,该表显示了两行标题" top"和"底部"
我有两个不同的数据NSArray
将在CollectionView中显示:
top = ["1","2","3"]
bottom = ["4","5","6"]
collectionView
有一个标签(在Storyboard中标识),所以我使用标签来定义视图并显示数据:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
if collectionView.tag == 2 {
objCollectionViewCellMiddle = collectionView.dequeueReusableCell(withReuseIdentifier: "collectioncellmiddle"
, for: indexPath) as! CollectionViewCellmiddle
objCollectionViewCellMiddle.lblMiddle.text = top[indexPath.row] as? String
return objCollectionViewCellMiddle
}
现在,TableView显示了两个CollectionViews,但它在CollectionView
中打印了来自top
数组的相同数据
我想:
第一 CollectionView --->显示top
数组
第二 CollectionView --->显示bottom
数组
我使用了indexPath.section,但无法想象它能够正常工作,因为它始终打印" 0"
答案 0 :(得分:1)
好的,我认为我们需要做的是改变您的设置方式。首先,我们应该将支持数据源更改为值类型,例如[String]
:
MyViewController类
class MyViewController: UIViewController {
var sectionsArray: [String] = ["top", "bottom"]
var topSection: [String] = ["1","2","3"]
var bottomSection: [String] = ["4","5","6"]
@IBOutlet weak var myTableView: UITableView!
@IBOutlet weak var topCollectionView: UICollectionView!
@IBOutlet weak var bottomCollectionView: UICollectionView!
}
然后,我们需要修改表视图和集合视图的数据源:
表格查看数据源
extension MyViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return sectionsArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let sectionName = sectionsArray[indexPath.section]
switch sectionName {
case "top":
let tableCell = tableView.dequeueReusableCell(withIdentifier: "cellmiddle", for: indexPath) as! TableCellMiddle
tableCell.lblMiddle.text = sectionName
return tableCell
case "bottom":
let tableCell = tableView.dequeueReusableCell(withIdentifier: "cellmiddle", for: indexPath) as! TableCellMiddle
tableCell.lblMiddle.text = sectionName
return tableCell
default:
return UITableViewCell()
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0:
return topSection.count
case 1:
return bottomSection.count
default:
return 0
}
}
}
在这里,cellForRow
方法实际上可以减少一些重复的代码,因为无论您处于哪个单元格,您都会做同样的事情。
集合查看数据源
extension MyViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
switch collectionView {
case topCollectionView:
return topSection.count
case bottomCollectionView:
return bottomSection.count
default:
return 0
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
switch collectionView {
case topCollectionView:
let collectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectioncellmiddle", for: indexPath) as! CollectionViewCellmiddle
collectionCell.lblMiddle.text = topSection[indexPath.row]
return collectionCell
case bottomCollectionView:
let collectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectioncellmiddle", for: indexPath) as! CollectionViewCellmiddle
collectionCell.lblMiddle.text = bottomSection[indexPath.row]
return collectionCell
default:
return UICollectionViewCell()
}
}
}
我们正在做的是切换实际的集合视图本身作为参数而不是您设置的标记传递,这样我们就可以轻松地看到当前正在访问哪个集合视图。一旦我们知道了这一点,我们就可以确定我们需要访问哪些支持数组,并可以相应地分配文本。
如果您愿意,也可以减少此方法中的一些重复逻辑。
This是一个编译的游乐场(我稍后会添加功能以演示它,以便它显示在时间轴中)。我认为它会帮助你实现你想要做的事情。
答案 1 :(得分:0)
我觉得问题在于这个功能:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
if collectionView.tag == 2 {
objCollectionViewCellMiddle = collectionView.dequeueReusableCell(withReuseIdentifier: "collectioncellmiddle"
, for: indexPath) as! CollectionViewCellmiddle
objCollectionViewCellMiddle.lblMiddle.text = top[indexPath.row] as? String
return objCollectionViewCellMiddle
}
}
数据分配显示:
objCollectionViewCellMiddle.lblMiddle.text = 顶部[indexPath.row] 为? 串
我建议您通过添加标记代码来更改tableview代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let strname = sectionsArray[indexPath.row]
if (strname as AnyObject).isEqual(to: "top"){
tableCellobj = tableView.dequeueReusableCell(withIdentifier: "cellmiddle", for: indexPath) as! TableCellMiddle
Add this: tableCellobj.collectionView.tag = 1
tableCellobj.lblMiddle.text = "\(strname)"
return tableCellobj
}
if (strname as AnyObject).isEqual(to: "bottom") {
tableCellobj = tableView.dequeueReusableCell(withIdentifier: "cellmiddle", for: indexPath) as! TableCellMiddle
Add this: tableCellobj.collectionView.tag = 2
tableCellobj.lblMiddle.text = "\(strname)"
return tableCellobj
}
}
然后:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
if collectionView.tag == 1 {
objCollectionViewCellMiddle = collectionView.dequeueReusableCell(withReuseIdentifier: "collectioncellmiddle"
, for: indexPath) as! CollectionViewCellmiddle
objCollectionViewCellMiddle.lblMiddle.text = top[indexPath.row] as? String
return objCollectionViewCellMiddle
}
else {
objCollectionViewCellMiddle = collectionView.dequeueReusableCell(withReuseIdentifier: "collectioncellmiddle"
, for: indexPath) as! CollectionViewCellmiddle
objCollectionViewCellMiddle.lblMiddle.text = bottom[indexPath.row] as? String
return objCollectionViewCellMiddle
}
}