UITableView Swift 将静态部分与动态部分结合起来

Posted

技术标签:

【中文标题】UITableView Swift 将静态部分与动态部分结合起来【英文标题】:UITableView Swift Combine static section with dynamics ones 【发布时间】:2019-08-14 22:00:05 【问题描述】:

主要思想是将所有部分放在一个数组中,或者您可以建议其他解决方案来构建表格。我在下面有这段代码来为表格准备数据:

enum ExerciseSection 
    case empty
    case exerciseGroup(group: ExerciseGroup)


struct ExerciseGroup 
    var muscleGroupName: String
    var exercises: [ExerciseEntity]
    var selectedExercisesIndexes: [Int]

正如你看到的使用这个ExerciseSection 枚举,我可以简单地检查该部分是否静态为空,或者它应该显示一些肌肉群名称。组还包含exercises。所以我可以简单地构建所需的单元格。

所以我通过创建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))
    )

所以现在我的数据按关系自动分组muscle 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 对象视为具有一些组来表示部分并且这些组具有表示行的项目的对象。所以我只需要把它结合起来。

在我的情况下,您可以简单地看到静态单元格是列表中的第一个项目,但我正在寻找灵活的解决方案,例如,我什至无法想象如何在列表中间显示静态单元格。

也许作为一种解决方案,我可以遍历监视器对象并从中创建我的枚举。不确定。

【问题讨论】:

【参考方案1】:

嗯...“最简单”的方法是拥有一个计算属性 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 和一些简单数据。

【讨论】:

以上是关于UITableView Swift 将静态部分与动态部分结合起来的主要内容,如果未能解决你的问题,请参考以下文章

Linux编译过程与动静态库制作

使用 Realm 和 Swift 的具有多个部分的 UITableView

如何在静态 UITableView 中仅删除一个部分的分隔符?

swift UITableView的。以编程方式将表头添加到表部分

在 Swift 中向 UITableView 添加按日期分隔的部分

Swift:UITableView 单元格受到另一部分中单元格的影响