我的问题
当我处理时UITableView,基本上table_data我的节和行都有一个数组。
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} ] }, ]
我使用heightForHeaderInSection,cellForRowAtindexPath,titleForHeaderInSection,didSelectRowAtindexPath这样的方法
heightForHeaderInSection
cellForRowAtindexPath
titleForHeaderInSection
didSelectRowAtindexPath
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 }
当我的数组是动态的时,使用数字0,1等会变得令人头疼table_data。动态是指某些节或行可以具有不同的位置,或者根本不存在。
0
1
例如,我删除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在函数中使用
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中进行组织。
section_positions_map
+1
-1
题
您知道使这部分变得容易的任何方法或框架吗?
我的想法
将type属性添加到我的字典
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收集类型)
if table_data[0]["type"] == "section_a"
enum
if table_data[0] is SubClassSectionA
但是他们俩对我来说都很难看。
我在创建表时使用的一种方法,在该表中我知道所有可能的部分都包含枚举。您为每种可能的节类型创建一个枚举:
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 } }