我试图将药物放置在与其类别相关的部分下,但我为我添加的同一类别的每种药物获得多个部分。我不确定使用模型宏时这个过程有多大不同。
List {
ForEach(activeStash) { drug in
Section(header: Text(drug.substanceClass)) {
NavigationLink(destination: StashLinkView(stashed: drug)) {
Text(drug.substance)
}
}
}
}
分组但有重复的部分结果:
List {
ForEach(activeStash) { drug in
Section(header: Text(drug.substanceClass)) {
ForEach(activeStash) { drug in
NavigationLink(destination: StashLinkView(stashed: drug)) {
Text(drug.substance)
}
}
}
}
}
解决方案:
List {
ForEach(Array(Set(activeStash.map { $0.substanceClass })), id: \.self) { substanceClass in
Section(header: Text(substanceClass)) {
ForEach(activeStash.filter { $0.substanceClass == substanceClass }) { drug in
NavigationLink(destination: StashLinkView(stashed: drug)) {
Text(drug.substance)
}
}
}
}
}
您的第一个
ForEach
需要过滤可用的物质类别(部分),第二个按物质类别过滤药物:
struct Drug: Identifiable, CustomStringConvertible {
let substance: String
let substanceClass: SubstanceClass
let id: UUID = UUID()
var description: String {
"Drug: \(substance) (\(substanceClass))"
}
}
enum SubstanceClass: String, CaseIterable, Identifiable {
case stimulant = "Stimulant"
case sedative = "Sedative"
var id: String {
self.rawValue
}
}
struct ContentView: View {
@State var substances: [Drug] = [
Drug(substance: "Caffeine", substanceClass: .stimulant),
Drug(substance: "Adrafinil", substanceClass: .stimulant),
Drug(substance: "Valerian", substanceClass: .sedative)
]
var body: some View {
VStack {
Text("Drug Store")
List {
ForEach(SubstanceClass.allCases) { substanceClass in
Section(header: Text(substanceClass.rawValue)) {
ForEach(substances.filter({$0.substanceClass == substanceClass})) { drug in
NavigationLink(destination: Detail(drug: drug)) {
Text(drug.substance)
}
}
}
}
}
}
.padding()
}
}
struct Detail: View {
let drug: Drug
var body: some View {
Text(drug.description)
}
}
我根据您问题中的可用内容构建了模型。