SwiftUI 和 MVVM:当视图模型更改 "data source" (`@Publish items`) 本身时如何为 "list elements change" 设置动画

SwiftUI & MVVM: How to animate "list elements change" when view model changes the "data source" (`@Publish items`) itself

我对 SwfitUI 和 Combine 还是比较陌生,所以也许我正在尝试做一些非常不正确的事情,但我只是看不出如何实现我打算用 Swift 做的事情UI和MVVM。 场景如下:

一切正常,但我想做的是使 ForEach 中的元素因 viewModel.items 变化而变化。

我能做的是 import SwiftUIViewModel 并使用 withAnimation 包装新 items 的设置。但这超出了 ViewModel 的目的,因为它现在直接引用 UI 代码。

这是我的一些代码:

struct HomeView: View {
    @StateObject var viewModel: ViewModel

    var body: some View {
         ForEach(items) { item in
            Text(item)
        }
    }
}
import SwiftUI // This should not be imported as it breaks MVVM patter

class ViewModel {
    @Published var items = [String]()

    func onItemsChanged(_ newItems: [String]) {
       withAnimation { // This works but will break MVVM patter
          items = newItems
       }
    }
}

有什么想法可以让 MVVM 快乐并与 Swift 一起工作UI?

向包含视图项的容器添加动画,如下所示

var body: some View {
  VStack {                      // << container
     ForEach(items) { item in
        Text(item)
    }
  }
  .animation(.default)          // << animates changes in items
}

完整示例请参阅后续帖子:, ,