Werte aus CoreData in SwiftUI ForEach addieren und anzeigen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Werte aus CoreData in SwiftUI ForEach addieren und anzeigen

    Hi,

    ich brauche mal wieder einen Anschubser. Ich habe Preise von Artikeln in CoreData. In einer SwiftUI ForEach Schleife baue ich mir eine Liste von Artikeln mit deren Name und Preis einzeln in jeder Zeile. Nun würde ich gerne am Ende einmal alles zusammenrechnen und den Gesamtpreis anzeigen lassen. Leider scheitere ich daran das ich innerhalb der ForEach Schleife keinen variablen addieren darf.......

    Quellcode

    1. @State var gesamtPreis:Double = 0
    2. var body: some View {
    3. ForEach(kasse) { k in
    4. HStack {
    5. Text(k.artikel ?? "")
    6. Spacer()
    7. Text("\(k.preis.formatted(.currency(code: "Eur")))")
    8. }
    9. }
    10. }
    wie bekomme ich k.preis addiert auf die gesamtPreis variable?

    Danke schon mal vorab für alle Ratschläge.

    Gruß

    Dirk
  • ForEach ist ein View. Die solltest du dafür nicht missbrauchen, weil sie nicht unbedingt immer alle Elemente der Sammlung durchlaufen muss. Außerdem ist auch nicht garantiert, wann sie das macht.

    Du solltest stattdessen lieber den Wert explizit berechnen. Am einfachsten geht es wahrscheinlich über reduce, z. B.:

    Quellcode

    1. kasse.reduce(0, { $0 + $1.preis })
    Und den Zustand des Views solltest du auf keinem Fall in body ändern. Berechnete Werte direkt an den View übergeben, der ihn anzeigen soll.
    „Meine Komplikation hatte eine Komplikation.“

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von macmoonshine ()

  • macmoonshine schrieb:

    ForEach ist ein View. Die solltest du dafür nicht missbrauchen, weil sie nicht unbedingt immer alle Elemente der Sammlung durchlaufen muss. Außerdem ist auch nicht garantiert, wann sie das macht.

    Du solltest stattdessen lieber den Wert explizit berechnen. Am einfachsten geht es wahrscheinlich über reduce, z. B.:

    Quellcode

    1. kasse.reduce(0, { $0 + $1.preis })
    Und den Zustand des Views solltest du auf keinem Fall in body ändern. Berechnete Werte direkt an den View übergeben, der ihn anzeigen soll.
    Danke für deine Antwort. Sowas habe ich mir schon gedacht. Aber ich verstehe gerade nicht ganz wie ich das handhaben soll. Alle Daten kommen aus CoreData. Wenn ich also etwas zu der Buchungsliste hinzufüge, die dort mit "ForEach" angezeigt wird, dann schreibe ich das in die "Datenbank". Die View merkt das und aktualisiert sich dann automatisch. Ich brauche doch ein Event wie ".onChange" um dann noch mal alle werte aus CoreData zu holen und diese zu addieren, damit ich diese wiederum in eine @State variable schreiben kann, damit sich die View mit der Summe aktualisiert....
    Welches Event nehme ich denn?

    Grüße

    Dirk
  • Manchmal fehlen einem nur die richtigen Stichworte bei der Suche nach einer Lösung. Ich löse das Problem nun mit

    Quellcode

    1. .task(id: kasse.count) {
    2. summarize()
    3. }
    Jedesmal wenn sich die Anzahl der Einträge in dem FetchedResult "kasse" ändert, rechne ich die Summe aus. Funktioniert bisher einwandfrei.

    Danke und Grüße

    Dirk