SwiftUser
SwiftUser

Reputation: 615

SwiftUI - How to pass data then initialise and edit data

I'm downloading data from Firebase and trying to edit it. It works, but with an issue. I am currently passing data to my EditViewModel with the .onAppear() method of my view. And reading the data from EditViewModel within my view.

class EditViewModel: ObservableObject {
    @Published var title: String = ""
}



struct EditView: View {
    @State var selected_item: ItemModel
    @StateObject var editViewModel = EditViewModel()
     var body: some View {
         VStack {
            TextField("Name of item", text: self.$editViewModel.title)
            Divider()
        }.onAppear {
            DispatchQueue.main.async {
                editViewModel.title = selected_item.title
               }
            }
      }
}

I have given you the extremely short-hand version as it's much easier to follow.

However, I push to another view to select options from a list and pop back. As a result, everything is reset due to using the onAppear method. I have spent hours trying to use init() but I am struggling to get my application to even compile, getting errors in the process. I understand it's due to using the .onAppear method, but how can I use init() for this particular view/view-model?

I've search online but I've found the answers to not be useful, or different from what I wish to achieve.

Thank you.

Upvotes: 1

Views: 617

Answers (1)

Asperi
Asperi

Reputation: 257693

You don't need to use State for input property - it is only for internal view usage. So as far as I understood your scenario, here is a possible solution:

struct EditView: View {
    private var selected_item: ItemModel
    @StateObject var editViewModel = EditViewModel()
    
    init(selectedItem: ItemModel) {
        selected_item = selectedItem
        editViewModel.title = selectedItem.title
    }
    
    var body: some View {
        VStack {
            TextField("Name of item", text: self.$editViewModel.title)
            Divider()
        }.onAppear {
            DispatchQueue.main.async {
                editViewModel.title = selected_item.title
            }
        }
    }
}

Upvotes: 2

Related Questions