Ваше первое решение не будет работать, так как изменения вложенных ObservableObjects не распространяются вверх:
class PurchaseViewModel: ObservableObject {
let clientViewModel: ClientViewModel
let itemsViewModel: ItemViewModel
...
}
Здесь можно найти обходной путь: Как указать представления SwiftUI для привязки к вложенным ObservableObjects .
Ваш второй подход верен и будет работать в большинстве случаев:
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
@ObservedObject var clientViewModel: ClientViewModel
...
}
Если вы используете ObservableObject
для многих представлений, вы можете вместо этого внедрить его в среду и получить доступ как @EnvironmentObject
.
В качестве альтернативы вы можете сделать свои вложенные объекты ObservableObject структурами :
class PurchaseViewModel: ObservableObject {
@Published var clientViewModel: ClientViewModel // <- add `@Published`
...
}
struct ClientViewModel { // <- use `struct` instead of `class`
...
}
Обратите внимание, что ваш ClientViewModel
будет становиться новой структурой каждый раз, когда она (или любая из его свойства) изменяется - этим решением не следует злоупотреблять (особенно для сложных ViewModels).