迅捷;MVVM:如何制作动画;列表元素更改“;当视图模型更改时;数据源“;(`@Publish items`)本身

迅捷;MVVM:如何制作动画;列表元素更改“;当视图模型更改时;数据源“;(`@Publish items`)本身,mvvm,swiftui,Mvvm,Swiftui,我对SwfitUI和Combine还比较陌生,所以我可能尝试做一些非常不正确的事情,但我就是看不到如何实现我使用SwiftUI和MVVM的目标。 以下是场景: ViewModel带有属性的类@Published var items=[String]() 主视图(HomeView),具有一个显示其视图模型中的项目的ForEach HomeView有一个@StateObject变量viewModel:viewModel HomeViewForEach使用viewModel中的项 ViewModel

我对SwfitUI和Combine还比较陌生,所以我可能尝试做一些非常不正确的事情,但我就是看不到如何实现我使用SwiftUI和MVVM的目标。 以下是场景:

  • ViewModel
    带有属性的类
    @Published var items=[String]()
  • 主视图(HomeView),具有一个显示其视图模型中的项目的
    ForEach
  • HomeView有一个
    @StateObject变量viewModel:viewModel
  • HomeView
    ForEach
    使用viewModel中的
  • ViewModel
    更改
    (在我的例子中,核心数据更改)
  • HomeView
    ForEach
    会立即反映更改
这一切都是可行的,但我想做的是为
ForEach
中的元素设置动画,因为
viewModel.items
发生了变化

我可以做的是
将SwiftUI
导入
视图模型
,并使用
和动画
包装新
项目的设置
。但这超出了ViewModel的目的,因为它现在直接引用UI代码

以下是我的一些代码:

struct HomeView: View {
    @StateObject var viewModel: ViewModel

    var body: some View {
         ForEach(items) { item in
            Text(item)
        }
    }
}

如果这能让MVVM高兴并与SwiftUI一起工作,有什么想法吗?

将动画添加到保存视图项的容器中,如下所示

var body: some View {
  VStack {                      // << container
     ForEach(items) { item in
        Text(item)
    }
  }
  .animation(.default)          // << animates changes in items
}
var主体:一些视图{

VStack{//您的视图可以通过切换在您的ViewModel中观察到一些布尔属性,例如切换(“,isOn:$ViewModel.someBoolProperty)。通过这种方式,您可以将工作转移到ViewModel。这就像一个符咒。谢谢。
var body: some View {
  VStack {                      // << container
     ForEach(items) { item in
        Text(item)
    }
  }
  .animation(.default)          // << animates changes in items
}