У меня есть представление SwiftUI, которое заменяет определенные элементы управления в зависимости от состояния. Я пытаюсь использовать MVVM, поэтому большая часть / все мои логи c перенесены в модель представления. Я обнаружил, что при выполнении сложного действия, которое изменяет @Published var
на модели представления, View
не будет анимироваться.
Вот пример, где таймер 1,0 с в модели представления моделирует другую работу, являющуюся сделано до изменения значения @Published var
:
struct ContentView: View {
@State var showCircle = true
@ObservedObject var viewModel = ViewModel()
var body: some View {
VStack {
VStack {
if showCircle {
Circle().frame(width: 100, height: 100)
}
Button(action: {
withAnimation {
self.showCircle.toggle()
}
}) {
Text("With State Variable")
}
}
VStack {
if viewModel.showCircle {
Circle().frame(width: 100, height: 100)
}
Button(action: {
withAnimation {
self.viewModel.toggle()
}
}) {
Text("With ViewModel Observation")
}
}
}
}
class ViewModel: ObservableObject {
@Published var showCircle = true
public func toggle() {
// Do some amount of work here. The Time is just to simulate work being done that may not complete immediately.
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { [weak self] _ in
self?.showCircle.toggle()
}
}
}