一尘不染

如何在iOS UITableView中处理动态的节和行

swift

我的问题

当我处理时UITableView,基本上table_data我的节和行都有一个数组。

[
   {
      title : "section A title",
      rows: [
          {data: row_1_data},
          {data: row_2_data}
      ]
   },
   {
      title : "section B title",
      rows: [
          {data: row_1_data},
          {data: row_2_data}
      ]
   },
]

我使用heightForHeaderInSectioncellForRowAtindexPathtitleForHeaderInSectiondidSelectRowAtindexPath这样的方法

 if indexPath.section == 0 {
        //section A
        if indexPath.row == 0 {
             //do something with table_data[0]["rows"][0]["data"]
        }
        elesif indexPath.row == 1 {
             //do something else
        }
 }
 if indexPath.section == 1 {
      //do something for section B
 }

当我的数组是动态的时,使用数字01等会变得令人头疼table_data。动态是指某些节或行可以具有不同的位置,或者根本不存在。

例如,我删除A节,而我的数组是

[
   {
      title : "section B title",
      rows: [
          {data: row_1_data},
          {data: row_2_data}
      ]
   }
]

我喜欢这样

self.section_A_position = 0
self.section_B_position = 1
func afterRemoveSectionA() {
    section_A_position = -999
    section_B_position = section_B_position - 1
    //write here another new sections for -1 
}

将另一部分C添加为0元素

self.section_C_position = -999
func afterAddSectionC() {
   section_C_position = 0
   section_A_position = section_A_position + 1
   section_B_position = section_B_position + 1
}

然后section_positions在函数中使用

 if indexPath.section == section_A_position {
        //section A
        if indexPath.row == 0 {
             //do something with table_data[0]["rows"][0]["data"]
        }
        elesif indexPath.row == 1 {
             //do something else
        }
 }
 if indexPath.section == section_B_position {
      //do something for section B
 }

它看起来很简单,但是当我有很多节并且要在数组中隐藏或移动它的情况很多时,将很难控制和添加新类型的节。有时候,我创建section_positions_map阵列将其存储起来,并+1-1操作循环。但这并没有帮助,当我需要此行为时,仍然很难在每个TableViewController中进行组织。

您知道使这部分变得容易的任何方法或框架吗?

我的想法

  1. type属性添加到我的字典

    {
    title : “section A title”,
    rows: [
    {data: row_1_data},
    {data: row_2_data}
    ]
    type : “section_a”
    }

并检查if table_data[0]["type"] == "section_a"(或用于enum收集类型)

  1. 子类化我的字典并检查

if table_data[0] is SubClassSectionA

但是他们俩对我来说都很难看。


阅读 191

收藏
2020-07-07

共1个答案

一尘不染

我在创建表时使用的一种方法,在该表中我知道所有可能的部分都包含枚举。您为每种可能的节类型创建一个枚举:

enum SectionTypes { case sectionA, sectionB, sectionC }

然后创建一个变量来保存这些部分:

var sections: [SectionTypes]

准备好数据后,将用需要显示的部分填充各部分。我通常还会提供一种方法来帮助您获得本节:

func getSection(forSection: Int) -> SectionTypes {
        return sections[forSection]
    }

通过此操作,您可以开始实现常见的DataSource委托方法:

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

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        switch getSection(forSection: section) {
        case .sectionA:
            return 0 //Add the code to get the count of rows for this section
        case .sectionB:
            return 0
        default:
            return 0
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        switch getSection(forSection: indexPath.section) {
        case .sectionA:
            //Get section A cell type and format as your need
        //etc
        }
    }
2020-07-07