我有一个名为PurchaseView
的视图。此视图显示有关购买,购买内容和购买者的详细信息。我正在做的是在这个视图中将ItemView
和ClientView
都放在PurchaseView
中。 ItemView
和ClientView
是共享的,并且已在我的应用程序的其他部分使用。它们具有自己的ViewModel。
我还尝试将ItemViewModel
和ClientViewModel
放在PurchaseViewModel
内,但我不知道是否可以将ObservableObject
放在另一个ObservableObject
内。这是一个好方法吗?ObservableObject
内应该没有ObservableObject
吗?以下哪一项更好?
这吗?
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?
}
答案 0 :(得分:0)
您的第一个解决方案将不起作用,因为嵌套的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
,则可以将其注入环境并以@EnvironmentObject
的身份访问。
或者,您可以将嵌套的ObservableObjects用作 struct :
class PurchaseViewModel: ObservableObject {
@Published var clientViewModel: ClientViewModel // <- add `@Published`
...
}
struct ClientViewModel { // <- use `struct` instead of `class`
...
}
请注意,您的ClientViewModel
每次更改(或其任何属性)都将成为新结构-不应过度使用此解决方案(尤其是对于复杂的ViewModels)。