从集合视图的数据源方法中找出表视图的部分

Posted

技术标签:

【中文标题】从集合视图的数据源方法中找出表视图的部分【英文标题】:Finding out table view's section from collection view's data source methods 【发布时间】:2018-03-09 13:23:22 【问题描述】:

我有一个UITableView,有 2 个部分,每个部分包含一个单元格。这些单元格包含UICollectionViews。这些集合视图具有不同的类型。为了遵循 MVC 设计模式,我将我的 ViewController 设置为数据源和 UITableViewUICollectionView 的委托。

这是我的表格视图的数据源代码:

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

    if indexPath.section == 0 
        let cell = tableView.dequeueReusableCell(withIdentifier: recomendationCellId, for: indexPath) as! RecomendationsTableViewCell
        cell.collectionView.dataSource = self
        cell.collectionView.delegate = self
        return cell
     else if indexPath.section == 1 
        let cell = tableView.dequeueReusableCell(withIdentifier: collectionCellId, for: indexPath) as! CollectionsTableViewCell
        cell.collectionView.dataSource = self
        cell.collectionView.delegate = self
        return cell
     else 
        return UITableViewCell()
    

现在,我需要使用collectionView(_:,cellForItem:) 方法将集合视图的单元格出列。在其中我需要检查表格视图的部分以使正确的单元格出列。

问题是我知道它应该有一个简单的解决方案,但无法弄清楚。您对如何实现这一点有什么建议吗?

【问题讨论】:

您可以继承 collectionView 并添加一个属性 并在您将 tableViewCell 出列时设置它 【参考方案1】:

如果集合视图在单元格内,则仅在cell 中处理它...所以当您设置cell.collectionView.dataSource = self 时,这意味着您将delegate 设置为当前视图控制器而不是单元格,这意味着集合视图看起来用于当前视图控制器中的数据源。

当您使用 MVC 时,最好在 cell 中实现数据源和委托方法。

所以你最终需要将cell.collectionView.dataSource = cell 设置为cell 将实现数据源和委托方法。

【讨论】:

但是数据源(和/或委托)不应该是视图控制器吗?我的意思是,视图控制器是为单元格提供数据并对不同操作做出反应的控制器。单元格只是UIView 的子类。因此,视图不应该负责向单元格提供数据。【参考方案2】:

即使您从单元格本身确认集合视图委托和数据源方法,您的 MVC 模式也不会中断模型负责为您提供数据,而不是控制器。 1.有一个模型来显示你的集合视图单元格数据 2. 从您的表格视图单元格本身确认它们!

extension yourTableViewCell: UICollectionViewDelegate 
    // Respective methods


extension yourTableViewCell: UICollectionViewDataSource 
    // Respective methods

【讨论】:

你是对的,但从模型的角度来看。但是控制器呢。单元格是UIView 的子类,因此它们基本上只是视图。通过符合数据源,我们说表格视图单元格应该向集合视图单元格提供数据。但这是控制器的职责,控制器通过向视图提供数据来连接视图和模型 您将 MVC 中的视图与 UIView 混淆了。视图对象是应用程序中用户可以看到的对象。视图对象“知道如何绘制自己”并且可以“响应用户操作”参考 - developer.apple.com/library/content/documentation/General/… 是的,而且UIView符合视图对象的定义,不是吗?

以上是关于从集合视图的数据源方法中找出表视图的部分的主要内容,如果未能解决你的问题,请参考以下文章

将数据从集合视图传递到表视图

如何将数据从集合视图传递到表视图类?

将数据从集合视图单元格内的表视图单元格传输到另一个集合视图单元格 [带图片!]

Oracle -----视图

MySQL调优

表视图单元格内的集合视图