我现在正在构建一个视图,我尝试根据类别使用 ForEach 获取多个 DisclosureGroup。这是最简单的部分。我的问题是第二个数组,我想在其中获取具有所述类别的项目。
我是游戏新手,仍在学习,但我不知道该怎么做。
代码在这里:
@Environment(\.modelContext) var context
@Query private var category: [CategoryModel]
@Query private var bonsai: [BonsaiModel]
@State private var searchQuery = ""
var body: some View {
NavigationStack {
VStack {
}
VStack(alignment: .center) {
List {
Section {
// Query category to build DisclosureGroup
ForEach(category) { categories in // Loop through category
DisclosureGroup(categories.name) {
ForEach(bonsai) { items in // Loop through bonsai, where bonsai.category = category
Text(items.name)
.bold()
if let category = items.category {
Text(category.name) // show category.title
.foregroundColor(Color(.systemGray))
.bold()
} else {
Text(" ")
.padding(.top, 4)
}
}
}
}
}
}
.padding(.horizontal, 8)
.padding(.top, 8)
.listStyle(.inset)
我在其中放入了两个文本项,以查看我尝试在“bonsai”ForEach 中获取哪些数据。
这是一张图片,可以形象化我想要实现的目标:
现在您可以看到所有内容,但您可以看到应用作“过滤器”并且仅显示在其组中的类别。
我的猜测是,它将与compactMap或filter一起使用,但我不知道如何让它工作。
您可以在内部循环中添加一个过滤器,如下所示:
ForEach(category) { categories in // Loop through category
ForEach(bonsai.filter { $0.category == category } )
有很多类似于
filter
的 Sequence 函数,您可以在 Apple 文档中了解。