Почему дочерний ViewModel создается при обновлении родительского представления в SwiftUI - PullRequest
0 голосов
/ 02 мая 2020

У меня есть приложение, созданное с помощью 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 восстанавливает все дочерние представления вместо того, которое изменяется?

1 Ответ

0 голосов
/ 02 мая 2020

Свойство body является вычислимым свойством, которое означает, что всякий раз, когда состояние (также наблюдаемые объекты, как в вашем случае), которое используется внутри него, изменяется, оно будет пересчитываться. Поэтому, если вам нужны данные, вы можете переместить модель в дочернем представлении в родительское представление и передать его дочернему, чтобы сохранить данные при повторном вычислении тела.

Документы Apple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...