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。
场景如下:
ViewModel
class 与 属性 @Published var items = [String]()
- 主视图 (HomeView)
ForEach
显示其视图模型中的项目
- HomeView 有一个
@StateObject var viewModel: ViewModel
-
HomeView
ForEach
使用来自 viewModelitems
的
ViewModel
更改 items
(在我的例子中核心数据更改)
-
HomeView
ForEach
立即反映变化
一切正常,但我想做的是使 ForEach
中的元素因 viewModel.items
变化而变化。
我能做的是 import SwiftUI
到 ViewModel
并使用 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
}
完整示例请参阅后续帖子:, , 。
我对 SwfitUI 和 Combine 还是比较陌生,所以也许我正在尝试做一些非常不正确的事情,但我只是看不出如何实现我打算用 Swift 做的事情UI和MVVM。 场景如下:
ViewModel
class 与 属性@Published var items = [String]()
- 主视图 (HomeView)
ForEach
显示其视图模型中的项目 - HomeView 有一个
@StateObject var viewModel: ViewModel
-
HomeView
ForEach
使用来自 viewModelitems
的 ViewModel
更改items
(在我的例子中核心数据更改)-
HomeView
ForEach
立即反映变化
一切正常,但我想做的是使 ForEach
中的元素因 viewModel.items
变化而变化。
我能做的是 import SwiftUI
到 ViewModel
并使用 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
}
完整示例请参阅后续帖子: