主要思想是将所有部分放在一个数组中,或者您可以建议其他解决方案来构建表。我有下面的代码来准备表的数据:
enum ExerciseSection {
case empty
case exerciseGroup(group: ExerciseGroup)
}
struct ExerciseGroup {
var muscleGroupName: String
var exercises: [ExerciseEntity]
var selectedExercisesIndexes: [Int]
}
正如您所见,使用此 ExerciseSection
枚举,我可以简单地检查该部分是否静态为空,或者它应该显示一些肌肉群名称。组还包含练习
。所以我可以简化构建所需的单元。
因此,我通过创建 ExerciseSection
数组来为表准备数据。
在这个音乐会示例中,我的空单元格是将我重定向到另一个屏幕的单元格。
看起来像这样:
[empty cell for section 0, group for section 1, group for section 2... and etc]
现在我改变了准备自己的部分的想法,而是开始使用 CoreStore.monitorSectionedList
typealias ListEntityType = ExerciseEntity
let monitor = CoreStore.monitorSectionedList(
From<ListEntityType>()
.sectionBy(#keyPath(ListEntityType.muscle.name)) { (sectionName) -> String? in
"\(String(describing: sectionName)) years old"
}
.orderBy(.ascending(\.name))
)
现在我的数据会按关系肌肉名称
自动分组。
我可以简单地访问监视器实例并查看它有多少个部分以及相应部分有多少行。太棒了!
但我现在的问题是如何将包含有关分组对象和组的所有所需信息的监视器对象与我的静态单元结合起来。
在上面的示例中,我有第 0 部分的第一个元素空单元格,但监视器也已经有第 0 部分。
所以我需要一个技巧来添加 1 +
,我真的不喜欢它,因为这是一个神奇的数字,有一天它会让我感到惊讶。
func numberOfSections(in tableView: UITableView) -> Int {
return 1 + (monitor.numberOfSections() ?? 0) // My static section + monitor sections
}
上一次我只有所有部分的数组[ExerciseSection]
,因此不需要通过1 +
来控制代码
我需要以某种方式粘合我的静态部分信息和monitor.sections
您以前可能从未使用过CoreStore
,所以没关系,您可以将monitor
对象视为一个对象,该对象具有一些组来表示部分,并且这些组具有要处理的项目代表行。所以我只需要把它结合起来。
就我而言,您可以简单地看到静态单元格是列表中的第一项,但我正在寻找灵活的解决方案,我什至无法想象如何在列表中间显示静态单元格。
也许作为一种解决方案,我可以循环遍历监视器对象并从中创建我的枚举。不确定。
最佳答案
嗯......“最简单”的方法是拥有一个计算属性sections
或类似的属性。
类似的东西
var sections: [ExerciseSection] {
return [.empty] + monitor.sections
}
但是,如果监视器没有直接获取部分的方法,那么最好的方法可能就是简单地拥有“前部分”列表。
let presections: [ExerciseSection] = [.empty]
func numberOfSections(in tableView: UITableView) -> Int {
return presections.count + (monitor.numberOfSections() ?? 0) // My static section + monitor sections
}
您可以添加一些功能来帮助您,例如
func section(at indexPath: IndexPath) -> ExerciseSection {
guard indexPath.section >= presections.count else {
return presections[indexPath.section]
}
return monitor.section(at: indexPath.section - presections.count)
}
您确实提到了循环监视对象,这对于较小的数据集来说可能很好。缺点是你突然将数据存储在内存中。我不知道显示器是如何工作的。
使用 Realm,我已经完成了此操作,但只存储了 id,可能还存储了每行的一些简单数据。
关于ios - UITableView Swift 将静态部分与动态部分结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57502595/