所以,我之前已经问过这个问题,但我觉得我需要更多的帮助,因为我无处可去。
我的应用程序的一点摘要:
立即声明: 用户可以在一个视图控制器上获取设备列表,并可以在开始屏幕上查看他们想要查看哪些设备。 设备的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,而且我不确定我的字典形式是否正确...
你能帮我吗?
答案 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
}