У меня есть приложение, созданное с помощью SwitUI с использованием MVVM, мое родительское представление содержит два представления A и B, каждое из которых имеет свою ViewModel, и B отображается условно. Дело в том, что когда B появляется , а скрывает , то создается все родительское представление, включая ViewModel A, что означает, что его данные потеряны.
Вот пример, в котором представление A содержит переменную с именем isDataRequested, когда при отображении представления устанавливается значение true, но при переключении ViewB isDataRequested будет сброшено.
Parent
struct ParentView: View {
@ObservedObject var viewModel: ParentViewModel
var body: some View {
VStack {
Text("Parent view")
Button(action: {
self.viewModel.showChildB.toggle()
}) {
Text("Toggle ChildB")
}.padding()
ChildAView(viewModel:
ChildAViewModel()
).padding()
if viewModel.showChildB {
Text("ChildB")
}
}
}
}
class ParentViewModel: ObservableObject {
@Published var showChildB = false
}
ChildA
struct ChildAView: View {
@ObservedObject var viewModel: ChildAViewModel
var body: some View {
VStack {
Text("Child A")
HStack {
Text("Is data requested: ")
Text(String(viewModel.isDataRequested)).fontWeight(.black)
}
}.onAppear {
self.viewModel.requestData()
}.background(Color.green)
}
}
class ChildAViewModel: ObservableObject {
@Published var isDataRequested = false
func requestData() {
print("request data A")
isDataRequested = true
}
}
Я могу создать экземпляр "ViewModelA" внутри "ParentViewModel", и данные не будут потеряны, но верно ли это Как это сделать? Какова лучшая практика? и самое главное, почему SwiftUI восстанавливает все дочерние представления вместо того, которое изменяется?