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

标签 ios swift uitableview corestore

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

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/

相关文章:

ios - 在 swift3 中安装 pod 后,链接器命令失败,退出代码为 1(使用 -v 查看调用)

ios - 拆分一个字符串

iOS paypal API - 苹果拒绝

iOS SFHFKeychainUtils *有时* 失败并出现错误 -25308 errSecInteractionNotAllowed

ios - 如何为核心数据中的属性替换或设置新值?

ios - 如何在重用之前清除从 UITableViewCell 以编程方式创建的元素

iOS 滑动检测仅适用于 1 个 UITableViewCell?

swift - 我不能在正则表达式中包含 ' 符号

ios - 为什么我的 UITableViewCell 附件复选标记不会显示?

ios - 如何在 UITableView 的选定单元格行中设置图像