【发布时间】:2020-08-12 00:07:58
【问题描述】:
当我的 viewModel 更改为错误状态时,我正在展示一个自定义视图。我想为这个演示文稿制作动画。我使用枚举表示 viewModel 状态
enum ViewModelState<T> {
case idle
case error(Error)
case loading
case data(T)
var isError: Bool {
switch self {
case .error:
return true
default:
return false
}
}
}
在我的 viewModel 中,我有这个属性...
@Published var state: ViewModelState = .idle
当它变为错误状态时,我想在我的错误视图中制作动画。当我在我的视图中使用 if 语句执行以下操作时,它会在...
private var content: some View {
return ZStack {
mainView // VStack
if case let .error(error) = viewModel.state {
ErrorView(
errorDescription: error.localizedDescription,
state: $viewModel.state
)
}
}.animation(.default)
}
var body: some View {
content
.navigationBarTitle(viewModel.title)
.navigationBarBackButtonHidden(true)
}
但是我想打开错误并执行此操作
private var content: some View {
switch viewModel.state {
case .idle:
return mainView.eraseToAnyView()
case let .error(error):
return ZStack {
mainView
ErrorView(
errorDescription: error.localizedDescription,
state: $viewModel.state
)
}.animation(.default).eraseToAnyView()
default:
return EmptyView().eraseToAnyView()
}
}
我不明白为什么这种方法不设置动画 - 有没有一种方法可以在不使用视图模型中的多个属性来表示状态枚举的状态/计算属性的情况下为视图设置动画,或者这是最好的方法吗?
【问题讨论】:
-
你能在
withAnimation视图修饰符的主体内设置状态变化吗?参考:developer.apple.com/documentation/swiftui/withanimation(::) -
第二个对 SwiftUI 来说从很多方面来说更糟糕,首先使用基于 if 的方法。