UICollectionViewCell内具有UITableView的自定义单元格

时间:2018-08-27 19:14:42

标签: swift uitableview uicollectionviewcell

我有一个用于UICollectionView的自定义UICollectionViewCell。我已将此自定义类标记为UITableViewDataSource和UITableViewDelegate,以便将UITableView放入“集合”视图的每个单元格中。

表视图在集合视图的每个单元格中均可正确呈现,但问题出在那些表视图标题和单元格中。

示例:我有10个问题,每个问题有5至6个选项。我将收藏夹视图中的项目数保留为questionList的数量,以创建正确数量的收藏夹视图单元格

 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return questionList.count
    }

当我如下创建每个单元格时:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! QuestionCell

        return cell
    }

自定义单元格(QuestionCell)可以正确呈现,但是所有自定义集合视图单元格仅显示第一个问题及其选项。我在这里的问题是,如何将每个集合视图单元格的indexPath.item与QuestionCell类内的TableView单元格的indexPath链接。

fileprivate func setUpViews(){
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(QuestionHeader.self, forHeaderFooterViewReuseIdentifier: headerId)
        tableView.register(OptionCell.self, forCellReuseIdentifier: cellId)
    }

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: headerId) as! QuestionHeader

    header.nameLabel.text = questionList[section].questionText

    return header
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


    return questionList[section].options.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! OptionCell

    cell.nameLabel.text = questionList[indexPath.row].options[indexPath.row].optionText

    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50.0
}

任何进行此操作的想法都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

我认为questionList [section] .options.count必须更改。

您要在每个集合视图单元格中放置一个问题列表吗?

不是使用collectionView的indexPath作为问题列表的索引,而不是tableView的部分

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return questionList[section].options.count
}

答案 1 :(得分:0)

是否应该只将questionList中的一个问题传递给您的QuestionCell而不是整个列表? 在您的QuestionCell中,它应如下所示:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: headerId) as! QuestionHeader

    header.nameLabel.text = question.questionText

    return header
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


    return question.options.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! OptionCell

    cell.nameLabel.text = question.options[indexPath.row].optionText

    return cell
}

答案 2 :(得分:0)

我能够通过在单独的Swift类中定义IndexPath变量并将其值设置在CollectionView的cellForItem函数中来解决此问题。通过这种方法,我能够在对应的TableViewCell内引用每个CollectionView单元格的indexPath。

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

  cellIndex = indexPath.item

    print("Cell index: ",cellIndex)
    if indexPath.item > 0{
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as! PageCell
        cell.tableView.reloadData()
        return cell
    }
    else {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as! PageCell
        cell.tableView.reloadData()
        return cell
    }

}