我有一个用于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
}
任何进行此操作的想法都会受到赞赏。
答案 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
}
}