Swift Collectionview数据源和章节

时间:2017-09-10 14:13:45

标签: swift uicollectionview

所以,我之前已经问过这个问题,但我觉得我需要更多的帮助,因为我无处可去。

我的应用程序的一点摘要:

立即声明: 用户可以在一个视图控制器上获取设备列表,并可以在开始屏幕上查看他们想要查看哪些设备。 设备的ID存储在一个数组中,如下所示:

devArray["device1", "device2",..]

此数组存储在UserDefaults中。从URLSession中提取服务器数据。

然后所有人都被拉到一起

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let colcel = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! MyCollectionViewCell
    let id = devArray[indexPath.row]
    let devListItem = self.devicesFromTheServer.filter { ($0["id"] as! String) == id }[0]

设备显示在CollectionView中,没有任何部分,用户可以重新排列单元格。这非常好。

我现在的目的是让您能够分段分组设备。 我想过一本字典就像这样:

dict["device1":"sectionA", "device2":"sectionA", "device3":"SectionB"]

但我无法理解如何构建Collectionview,而且我不确定我的字典形式是否正确...

你能帮我吗?

1 个答案:

答案 0 :(得分:2)

您可以采用以下几种方法。第一个是二维数组,它是一个包含每个部分的设备数组的数组。另一种方法更具可扩展性,允许您只为设备名称建模数据。

第二种方法是我在下面提到的。

你需要的是这样的:

/// Defines a section in data source
struct Section {

   // MARK: - Properties

   /// The title of the section
   let title: String

   /// The devices in the section
   var devices: [String]
}

然后在视图控制器中定义一个存储部分的数组,如下所示:

var dataSource = [Section(title: "Section 1", devices: ["Device 1"]), Section(title: "Section 2", devices: ["Device 2","Device 3"])]

您可以使用您已有的一些逻辑,通过将设备附加到单独功能的每个部分来自定义此设置。我只是为了这个答案而简化了。

然后添加这些集合视图数据源和委托方法:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return dataSource[section].devices.count
  }

func numberOfSections(in collectionView: UICollectionView) -> Int {
  return dataSource.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MyCollectionViewCell
  cell.textLabel?.text = dataSource[indexPath.section].devices[indexPath.row]
  return cell
}