#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
. Большое вам спасибо!!!!!