如何从子 UICollectionview 中获取 UITableView 的一部分

Posted

技术标签:

【中文标题】如何从子 UICollectionview 中获取 UITableView 的一部分【英文标题】:How to get section of UITableView from inside a child UICollectionview 【发布时间】:2016-11-18 00:43:14 【问题描述】:

我有一个UITableView,其每一行中都有一个UICollectionView,如下图所示。

来源:https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell-in-swift/

我的应用程序的目的是在每个表格视图行中显示一种语言的字符集。每个字符都包含在相应行内的集合视图的集合视图单元格中。

我遇到的问题是每个 tableview 行都显示英文字符集。

这是因为每个 collectionview 只有一个部分,因此每个 collectionview 都使用相同的 indexPath.section 零值。

我需要做的是获取集合视图所在的表格视图单元格的部分值,并以某种方式将其传递给

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

我已经尝试了几件事,但我找不到从其中的 collectionview 访问 tableview 部分值的方法。

我的代码有点乱,但通常重要的部分是

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "HorizontalSlideCell", for: indexPath)

    return cell


...

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "InnerCollectionViewCell",
                                                  for: indexPath as IndexPath)

    //format inner collectionview cells

    //indexPath.section is the collectionview section index but needs to be its parent tableview section's index. How do I get it? 
    cellCharLabel?.text = Languages.sharedInstance.alphabets[indexPath.section].set[indexPath.row].char
    cellCharLabel?.textAlignment = .center
    cellCharLabel?.font = UIFont(name: "Helvetica", size: 40)

    cell.contentView.addSubview(cellCharLabel!)

    return cell

【问题讨论】:

【参考方案1】:

你可以设置collectionView标签来实现。 CollectionView 应该是tableViewCell 的子视图。那就是collectionView可以是你自定义TableViewCell的属性好像你在用Prototype Cell

class YourCustomizeTableViewCell: UITableViewCell 
   let collectionView: CollectionView
   ...




override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "HorizontalSlideCell", for: indexPath) as! YourCustomizeTableViewCell
   cell.collectionView.tag = indexPath.row

   return cell


...

func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "InnerCollectionViewCell",
                                              for: indexPath as IndexPath)


//indexPath.section is the collectionview section index but needs to be its parent tableview section's index. How do I get it? 
cellCharLabel?.text = Languages.sharedInstance.alphabets[collectionView.tag].set[indexPath.row].char
 ...
return cell

【讨论】:

干杯。正是我想要的! 如果我们在集合视图中传递标签,但由于可重复使用的表格视图单元格,我得到了前一个单元格和前一个标签。 @user1960279 在cell.collectionView.tag = indexPath.row 之后,collectionView 的标签被重新分配。你在哪里使用了这个标签?【参考方案2】:

我假设您有一个带有 UICollectionView 实例的自定义 UITableViewCell 类,因此您只需在调用 cellForRowAtIndexPath 时将部分索引传递给它。

您需要在 tableViewCell 类中创建一个 var 来保存节索引。

 class CustomTableViewCell: UITableViewCell 
      var sectionIndex:Int?

 

然后在调用 cellForRow... 时,您只需将部分传递给该单元格。

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "HorizontalSlideCell", for: indexPath) as CustomTableViewCell
    cell.sectionIndex = indexPath.section
    return cell

不确定您是如何将数据加载到集合视图中的,因为您没有显示它,但是一旦您的表格视图单元格具有该部分,您就可以执行许多操作来加载您的数据。

如果您需要更多详细信息,请告诉我

【讨论】:

这很有帮助。谢谢! 对不起,我还没有得到如何从 CollectionViewCell 访问 sectionIndex ,你能提供一个例子吗?谢谢(非常紧急)

以上是关于如何从子 UICollectionview 中获取 UITableView 的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何从子进程中获取环境?

如何从子查询中获取 ResultSet 的别名?

如何从子查询中只获取一行?

如何在 sparkSQL 中使用从子查询中获取单个值

如何从子查询中获取结果作为查询中的参数

如何从子组件中获取父表单的字段? [复制]