SwiftUI是否可以将ObservableObject放在另一个ObservableObject中?

时间:2020-07-09 22:10:52

标签: ios swift swiftui

我有一个名为PurchaseView的视图。此视图显示有关购买,购买内容和购买者的详细信息。我正在做的是在这个视图中将ItemViewClientView都放在PurchaseView中。 ItemViewClientView是共享的,并且已在我的应用程序的其他部分使用。它们具有自己的ViewModel。

我还尝试将ItemViewModelClientViewModel放在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?
}

1 个答案:

答案 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)。