Swiftui将数据传递到ViewModel

我正在尝试将我传递到视图的数据放入ViewModel中。

我看到很多有关从JSON或Firebase等外部来源检索数据的教程,但没有使用我上一页传递的数据。

我必须对数据进行大量计算才能获取最终输出。

在这里,我需要将“输入”进入ShowViewModel。

struct ShowView: View {

    @ObservedObject var entry:EntryData

    var showVM = ShowViewModel()

    var body: some View {

       Text("(entrybeg)")

    }
}

我只是在这里玩空白的ViewModel进行测试。

class ShowViewModel: ObservableObject {

    @Published var test = "something"
    @Published var m:Month = Month()

}
stack overflow SwiftUI passing data into ViewModel
原文答案
author avatar

接受的答案

Swiftui不使用视图模型,您必须学习一些新知识。 Swiftui使用超快速创建的轻量级数据结构(不当命名为视图),告诉系统如何创建屏幕上显示的实际视图,然后立即抛弃,如果您遵循Apple的教程,他们声明“视图非常便宜,我们鼓励您使它们成为您的主要封装机制”( 20:50 Data Essentials )。您还可以将相关属性分组到其自己的自定义结构中,以便将对任何属性的更改视为对结构本身的更改,这称为“值语义”,这是您无法使用诸如视图模型对象之类的对象获得的structs的功能。在父视图中使用 @State 定义一个struct var,并使用 @Binding 在儿童视图中引用它,并使用$语法将其传递。这些属性包装器允许结构像对象参考一样行为。 SwiftUi确实会跟踪依赖性跟踪,如果任何 @State@Binding 的 ```
struct ShowViewConfig {
var test = "something"
var m:Month = Month()

// you can even put a method in to update it
mutating func fetch(name:String, ascending: Bool){
}

}



 `ContentView` 

然后在您的 ```
struct ContentView {
    @State var config = ShowViewConfig()
     var body: some View {
          ...
          ShowView(config:$config)

``` 中创建它,例如:

 `ShowView` 

然后在您的 ```
struct ShowView: View {
    @Binding var config : ShowViewConfig
    var body: some View {
       Text("(config.test)")
    }
}

``` 中使用它,例如:

 [Data Essentials in SwiftUI WWDC 2020](https://developer.apple.com/videos/play/wwdc2020/10040/) 

您可以在 [![enter image description here](https://i.stack.imgur.com/sAFnc.jpg) 中的8:44看到此模式

 `@ObservableObject` ](https://i.stack.imgur.com/safnc.jpg)

如果您有一个模型对象,即由 [WWDC 2020 Structure your app for SwiftUI previews @ 11:22](https://developer.apple.com/videos/play/wwdc2020/10149/?time=682) 监视的对象,那么您的作业是在层次结构中某处的视图struct中的富数据类型转换为简单数据类型,如有必要。您可以在 [![enter image description here](https://i.stack.imgur.com/5G7ua.png) 中了解更多有关此的信息。因此,您可以查看是否尝试在视图模型对象而不是视图结构中执行此操作,那么这是错误的方法。

 `@ObservableObject` ](https://i.stack.imgur.com/5g7ua.png)

使用 [20:14 Data Essentials](https://developer.apple.com/videos/play/wwdc2020/10040/?time=1251) 的加载程序或fetcher( [![enter image description here](https://i.stack.imgur.com/YStmg.png) )也可以。

  ](https://i.stack.imgur.com/ystmg.png)

答案: