SwiftUI — как передавать данные, затем инициализировать и редактировать данные

#swiftui

#свифтуи

Вопрос:

Я загружаю данные из Firebase и пытаюсь их отредактировать. Это работает, но с проблемой. В настоящее время я передаю данные в my EditViewModel с .onAppear() помощью метода my view. И считывание данных EditViewModel из моего поля зрения.

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

Я дал вам очень короткую версию, так как ей гораздо легче следовать.

Тем не менее, я нажимаю на другое представление, чтобы выбрать параметры из списка и вернуться назад. В результате все сбрасывается из-за использования метода onAppear. Я потратил несколько часов, пытаясь использовать init(), но я изо всех сил пытаюсь заставить мое приложение даже компилироваться, получая ошибки в процессе. Я понимаю, что это связано с использованием метода .onAppear, но как я могу использовать init() для этого конкретного представления / view-model?

Я поискал в Интернете, но нашел ответы, которые не были полезными или отличались от того, чего я хотел достичь.

Спасибо.

Ответ №1:

Вам не нужно использовать State для свойства ввода — оно предназначено только для использования во внутреннем представлении. Итак, насколько я понял ваш сценарий, вот возможное решение:

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

Комментарии:

1. Ах! Я передавал в ViewModel качестве параметра , в отличие от фактического ItemModel . Большое вам спасибо!!!!!