gpt4 book ai didi

ios - SwiftUI 可以将 ObservableObject 放入另一个 ObservableObject 中吗?

转载 作者:行者123 更新时间:2023-12-04 11:36:08 33 4
gpt4 key购买 nike

我有一个名为 PurchaseView 的 View .此 View 显示有关购买、购买的内容和购买者的详细信息。我正在做的是,在这个 View 中,我同时放置了 ItemViewClientViewPurchaseView . ItemViewClientView已共享,并在我的应用程序的其他部分中使用。 他们有自己的 ViewModel。
我也试过把 ItemViewModelClientViewModelPurchaseViewModel但我不知道是否可以放 ObservableObject在另一个 ObservableObject .这是一个好方法还是不应该有任何 ObservableObjectObservableObject 内?以下哪一项更好?
这个?

class PurchaseViewModel: ObservableObject {
let clientViewModel: ClientViewModel
let itemsViewModel: ItemViewModel

//
}
或这个?
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
@ObservedObject var clientViewModel: ClientViewModel

var body: some View {
//
}
}
购买型号:
class Purchase {
let id: String
let total: Double
// ...
var item: Item?
var client: Client?
}

最佳答案

您的第一个解决方案将不起作用,因为对嵌套 ObservableObjects 的更改不会向上传播:

class PurchaseViewModel: ObservableObject {
let clientViewModel: ClientViewModel
let itemsViewModel: ItemViewModel
...
}
可以在此处找到解决方法: How to tell SwiftUI views to bind to nested ObservableObjects .

您的第二种方法是正确的,并且适用于大多数情况:
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
@ObservedObject var clientViewModel: ClientViewModel
...
}
如果您分享了 ObservableObject对于许多 View ,您可以将其注入(inject)环境并作为 @EnvironmentObject 访问。 .

或者,您可以使嵌套的 ObservableObjects 成为结构:
class PurchaseViewModel: ObservableObject {
@Published var clientViewModel: ClientViewModel // <- add `@Published`
...
}
struct ClientViewModel { // <- use `struct` instead of `class`
...
}
请注意您的 ClientViewModel每次它(或其任何属性)发生变化时都会变成一个新的结构——这个解决方案不应该被过度使用(特别是对于复杂的 ViewModel)。

关于ios - SwiftUI 可以将 ObservableObject 放入另一个 ObservableObject 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62824472/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com