使用模型中的分组值循环部分

问题描述 投票:0回答:1

我试图将药物放置在与其类别相关的部分下,但我为我添加的同一类别的每种药物获得多个部分。我不确定使用模型宏时这个过程有多大不同。

当前结果

   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)
            }
        }
    }
}

}

ios swift swiftui swiftui-list
1个回答
0
投票

您的第一个

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)
    }
}

我根据您问题中的可用内容构建了模型。

© www.soinside.com 2019 - 2024. All rights reserved.