我有一个数组
secInfArr = []
let secInf1 = SecInfObj.init()
secInf1.selected = true
secInf1.itemName = "item1"
secInf1.sectionName = "section3"
secInfArr.append(secInf1)
let secInf2 = SecInfObj.init()
secInf2.selected = true
secInf2.itemName = "item1"
secInf2.sectionName = "section1"
secInfArr.append(sectionInfo2)
let secInf3 = SecInfObj.init()
secInf3.selected = true
secInf3.itemName = "item1"
secInf3.sectionName = "section1"
secInfArr.append(secInf3)
let secInf4 = SecInfObj.init()
secInf4.selected = false
secInf4.itemName = "item1"
secInf4.sectionName = "section2"
secInfArr.append(secInf4)
我希望创建一个tableView
,其中所有内容都按sectionName
属性进行分组,并且该部分中的所有itemName
按字母顺序排序。
到目前为止,我正在做我认为效率低下的事情。我正在对数组中的Distinct
属性执行sectionName
操作,然后使用它来命名节并计算它们。之后,在CellForRowAtIndexPath
方法中,我只使用sectionName
过滤数组,然后添加单元格。
我还想过使用NSFetchedResultsController
,但我认为这不是一个好主意,因为数据本质上并不持久,因此不需要在managedObject
表格。
在这种情况下,为分组表视图构建数据的理想方法是什么?
答案 0 :(得分:2)
我推荐一个面向对象的解决方案,例如一个带有name
属性和items
数组的结构,这里是通用形式。
struct Section<T> {
let name : String
var items = [T]()
}
如果经常变异items
数组,请使用class
而不是struct
来利用引用语义。
填充数据源时,将SecInfObj
个对象分配给相应的Section
实例。
可以轻松对项目进行排序,您可以声明数据源
var data = [Section<SecInfObj>]()
在numberOfRows
返回
return data[section].items.count
您可以使用
按索引路径获取该部分let section = data[indexPath.section]
然后带
的项目let items = section.items[indexPath.row]
答案 1 :(得分:0)
我建议根据章节将它们分别放入不同的数组中。在数据源中调用要容易得多,尤其是numberOfRowsInSection
和cellForRowAt
方法。 UITableView也很容易为每个单元格获取数据,因为它可以通过索引直接访问数组。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return items0.count
}
else if section == 1 {
return items1.count
}
return 0
}
或者也可能类似于下面。如果全部分别进入items[0] ... items [n]
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items[section].count
}