0

I'm starting with SwiftUI and I'm running into a roadblock with array items of an ObservableObject not saving to the main object.

Main object:

class Batch: Codable, Identifiable, ObservableObject {
    let id: String
    var items = [Item]()
}

Item object:

class Item: Codable, Identifiable, ObservableObject {
    let id: String
    var description: String
}

I have a BatchView which I pass a batch into:

struct BatchView: View {
    @ObservedObject var batch: Batch

    var body: some View {
        List {
            ForEach(batch.items) { item in
                ItemView(item: item)
            }
        }
        .navigationBarTitle(batch.items.reduce("", { $0 + $1.description }))
    }
}

In the ItemView I change the description:

struct ItemView: View {
    @ObservedObject var item: Item
    @State private var descr = ""

    var body: some View {
        VStack(alignment: .leading) {
            Text("MANUFACTURED")
            TextField("", text: $descr) {
                self.updateDescr(descr: self.descr)
            }
        }
    }

    private func updateDescr(descr: String) {
        item.description = descr
    }
}

But when I update the description for a batch item, the title of BatchView doesn't change, so the changes to the Item isn't coming back to the root Batch.

How do I make the above work?

gnarlybracket
  • 1,691
  • 4
  • 18
  • 37

1 Answers1

0

This answer helped me. I had to explicitly add @Published in front of the variable I was changing.

gnarlybracket
  • 1,691
  • 4
  • 18
  • 37