独立填充集合视图的每个部分 Swift

Posted

技术标签:

【中文标题】独立填充集合视图的每个部分 Swift【英文标题】:Populating each section of collection view independently Swift 【发布时间】:2017-02-16 19:58:18 【问题描述】:

我在表格视图中嵌入了一个集合视图,因此它可以垂直和水平滚动。它有四个部分,今天,本周,本月,今年。我无法理解如何用自己的数据填充每个部分。现在我正在使用下面的代码来填充集合视图,但所有部分都有相同的数据。如何使用自己的数据填充每个部分?

因此,如果我有一组今天的图像、一组本周的图像、一组本月的图像和一组今年的图像,我如何将其部分中的图像视图设置为相应数组中的项目?所以 Today 应该有 todayImageArray 中的图像,This Week 应该有 thisWeekImageArray 中的图像等等。

我还将集合视图的委托和数据源设置为表视图。

非常感谢任何帮助!

let images: [[UIImage]] = [
    [image_1, image_2, image_3, image_4],
    [image_5, image_6, image_7, image_8],
    [image_9, image_10, image_11, image_12],
    [image_13, image_14, image_15, image_16]
]    

func numberOfSections(in collectionView: UICollectionView) -> Int 
    return images.count


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return images[section].count


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

    cell.imageView.image = images[indexPath.section][indexPath.row]

    return cell

【问题讨论】:

【参考方案1】:

您需要一个结构化的数据源。目前,从您的代码来看,您似乎有一个名为 images 的数组,并且您正在使用它来提供项目数并更新单元格内容。但是,如果您需要单独的部分,则需要对数据源进行建模,并为数据源和 collectionView 中的委托方法提供逻辑响应。

简单数据源示例:

let simpleDataSource: [[UIImage]] = [
  [image1, image2],
  [image3, image4],
  [image5, image6]
]

在 collectionView 方法中使用 this 的示例:

func numberOfSections(in collectionView: UICollectionView) -> Int 
  return simpleDataSource.count


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
  return simpleDataSource[section].count


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath) as! ImageCollectionViewCell
  cell.imageView.image = simpleDataSource[indexPath.section][indexPath.row]
  return cell

您还应该通读documentation for UICollectionView。

【讨论】:

感谢您的回答!我一定会再次通读文档。我尝试了您的代码,它正在使用第一组数据更新所有部分图像视图,因此参考您的示例代码,所有部分图像视图都是 image1 和 image2。您知道是什么原因造成的吗? 已更新以添加缺少的 numberOfSections 方法,但如果您正在运行此方法并且每个部分中都有相同的图像,则您没有引用我的示例代码... 感谢@garrettmurray,您添加的那段代码起到了作用。但是,现在所有部分都包含数组中的所有数据。所以每个部分都有:image1,image2,image3,image4,image5,image6。我之前已阅读过有关集合视图的文档,但您的回答确实帮助我更好地理解它们,所以谢谢! 没有看到您的自定义单元格代码,很难判断。在我看来,您可能会在单元格中添加一个imageView,导致每次重用单元格时都会将其添加到视图层次结构中。我先看看那里。 很好的答案! @garrettmurray【参考方案2】:

设置一个数组,其中包含您的所有图像,或者更好的结构,以便更好地组织您的信息,或者像我的示例中那样的图像名称,然后使用numberOfSectionsindexPath.section 属性来分配这些图像:

let images = [
    ["imageA1", "imageA2"],
    ["imageB1", "imageB2"]
]

override func numberOfSections(in collectionView: UICollectionView) -> Int 
    return images[section]


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return images[section].count


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

    cell.imageView.image = UIImage(named: images[indexPath.section][indexPath.row])

    return cell

【讨论】:

以上是关于独立填充集合视图的每个部分 Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何将点击手势添加到 UIViews 数组?

Swift:动态填充 TableView 中的部分数量和 numberOfRowsInSection

嵌套集合视图 Swift 4.2

重用集合视图的 XIB 视图作为其他视图的一部分?

独立测试rails部分视图

Swift UI 集合视图布局