使用两个UICollectionView在UITableView中显示不同的数据

时间:2017-06-27 16:27:18

标签: ios swift uitableview uicollectionview uicollectionviewcell

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

2 个答案:

答案 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
    } 
}