繁体   English   中英

在 SwiftUI 中创建带有节标题的动态列表?

[英]Creating a dynamic List with section headers in SwiftUI?

我正在试验 SwiftUI,我正在尝试构建一个我已经在 UIKit 中绘制的锻炼跟踪器应用程序。 我正在尝试构建一个练习列表供用户参考,因此当应用程序启动时,我会在 CoreData 中加载一些练习,并且该练习具有以下属性。

@NSManaged public var name: String
@NSManaged public var muscleGroup: String
@NSManaged public var exerciseDescription: String
@NSManaged public var type: String
@NSManaged public var id: UUID

当我构建列表视图时,我从 CoreData 中检索了一个练习数组并将它们加载到一个列表中。 这适用于基本列表,问题是我想按字母顺序创建一个带有部分标题的列表。 在 UIKit 中,我通过构建 [ "Prefix" : [Exercise]] 形式的字典并使用键作为节标题来做到这一点。 这很实用,因为我可以通过更改字典和重新加载数据为用户提供排序选项。 在 SwiftUI 中,我似乎无法使其工作,因为我无法在创建视图之前处理 fetch 请求对象,并且无法迭代字典。 这是我的代码:

import SwiftUI
import CoreData

struct ExerciseListUIView: View {

@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
    entity: Exercise.entity(),
    sortDescriptors: [
        NSSortDescriptor(keyPath: \Exercise.name, ascending: true)
    ]
) var exerciseList: FetchedResults<Exercise>

@State private var prefixList = [String]()

var body: some View {

    return NavigationView {

        VStack{
            List(exerciseList, id: \.self) { exercise in
                Text(exercise.name)
            }
        }
        .navigationBarTitle("Exercises")
    }
}
}

我尝试了很多东西,但似乎没有任何效果。 最有前途的解决方案似乎是将练习直接存储在不同的数据结构中,ExtractionsByLetter(prefix: "String", Exercise: [Exercise]),检索 [ExercisesByLetter] 的数组并对其进行迭代以构建列表,但这意味着改变我存储数据的方式,在数据存储功能中添加更多的工作,并被迫为每个排序选项添加不同的存储,例如 ExercisesByMuscleGroup、ExtractionsByEquipment 等。

让我知道你的想法,谢谢。

对于任何对解决方案感兴趣的人,我想出了以下内容。 我为我的主视图创建了一个 ViewModel 来操作数据。 在那个视图模型中,我从 CoreData 中以 [Exercise] 数组的形式检索所有练习,并将它们存储在 ViewModel 的一个属性中。 然后我创建了一个辅助函数来遍历 [Exercise] 列表并创建一个 [ExercisesBy] 数组。 此类型包含一个存储排序标准(第一个字母、肌肉群、设备等)的属性和另一个存储符合该标准的运动数组的属性。

然后从我的视图中迭代这个 ExamsBy 数组以构建分段列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM