我如何获得“约束力”从我的模型到我的观点?

发布于 2025-02-09 02:20:59 字数 1053 浏览 1 评论 0原文

我是Swift的新手,并且已经在遇到问题了。从我的理解来看,将应用程序分为描述数据,显示内容并允许用户输入的视图以及将用户意图转化为数据修改并允许视图相应反应的模型是一个很好的做法。

话虽如此,我着手使用该逻辑进行非常简单的应用程序。 因此,我创建了一个像这样的模型文件:

import Foundation

struct MyModel {
    var testData: Double
    ...
}

然后是一个看起来像这样的ViewModel;

import Foundation

class MyViewModel: ObservableObject {
    @Published var myModel = MyModel(testData: 0)

    func setTest(_ newVal: Double) {
        splitModel.testData = newVal
    }

    ...
}

最后我的观点是:

struct ContentView: View {
    @ObservedObject var viewModel = MyViewModel()

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Hello", value: viewModel.splitModel.amount, format: .currency(code: "USD"))
                }
            }
        }
    }
}

这是不起作用的,因为viewModel.splitmodel.amount不是绑定,而是直接double。我发现修复的唯一方法就是将数据放在@State的视图中,因此,通过获得此文件结构,我正试图避免的内容。

我想对我应该实施的逻辑来解释它使它起作用,并可以纠正我对Swift的理解。 提前致谢 !

I'm fairly new to Swift and I'm already running problems. From my understanding, it is good practice to split the app into Models that describe the data, Views that display stuff and allow for user input, and ViewModels that translate the user's intents into data modification and allows the view to react accordingly.

That being said, I set out on doing a very simple app using that logic.
So I create a model file that goes like:

import Foundation

struct MyModel {
    var testData: Double
    ...
}

then a viewModel that looks like this;

import Foundation

class MyViewModel: ObservableObject {
    @Published var myModel = MyModel(testData: 0)

    func setTest(_ newVal: Double) {
        splitModel.testData = newVal
    }

    ...
}

and finally my view:

struct ContentView: View {
    @ObservedObject var viewModel = MyViewModel()

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Hello", value: viewModel.splitModel.amount, format: .currency(code: "USD"))
                }
            }
        }
    }
}

And this doesn't work because viewModel.splitModel.amount isn't a Binding but a straight up Double. The only way I found to fix that is to just put the data in the view with @State, so exactly what I was trying to avoid by getting this file structure.

I would love an explanation of the logic I'm supposed to implement to make it work, and maybe get corrected about my comprehension of Swift.
Thanks in advance !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七颜 2025-02-16 02:20:59

您可以使用$符号来参考绑定。

TextField("Hello", value: $viewModel.splitModel.amount, format: .currency(code: "USD"))

也不使用@obseverobject在这里使用@stateObject@obseverObject仅在视图不初始化ViewModel并注入视图时才能使用。

You can use the $ sign to refer to the binding.

TextField("Hello", value: $viewModel.splitModel.amount, format: .currency(code: "USD"))

Also dont´t use @ObservedObject here use @StateObject. @ObservedObject should only be used if the view does not initialize the viewmodel and it is injected.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文