[英]SwiftUI 2 View Models in a View
我有這個觀點,它以自己的觀點 Model 作為參數。 在這個視圖中,我需要顯示另一個視圖,為了顯示它,需要它自己的視圖 Model。 所以我展示了Purchase
視圖,然后在Purchase
視圖中我需要顯示購買的實際項目的詳細信息。 所以我也將ItemViewModel
作為參數傳遞。 PurchaseViewModel
和ItemViewModel
也用於其他視圖。
它可能發生在我還需要ClientViewModel
的功能中,該模型將用於顯示有關該商品的實際買家的數據。 這是否意味着我還需要將@ObservedObject var clientViewModel: ClientViewModel
作為參數傳遞?
我的問題是:這種方法好還是有更好的方法來做到這一點?
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
var body: some View {
VStack {
Text(purchaseViewModel.title)
ItemView(itemViewModel: itemViewModel)
}
}
}
class Purchase {
let senderID: String
let receiverID: String
var status: PurchaseStatus
var item: Item?
}
您可以讓PurchaseViewModel
包含ItemViewModel
和ClientViewModel
作為屬性,就像PurchaseView
包含ItemView
和ClientView
一樣。
這將使PurchaseViewModel
負責創建其他視圖模型的實例。 PurchaseView
的父級不再需要了解PurchaseView
的實現。
您應該首先考慮模型的關系,而不是視圖模型。
例如,您可以假設Purchase
涉及一個或多個項目 ( Item
) 和購買者 ( Client
)。 在這種情況下,您實際上會創建一個 model 類似於:
class Purchase {
var items = [Item]()
var client: Client
...
}
您的PurchaseViewModel
將反映這一點,包含ItemViewModel
和ClientViewModel
let clientViewModel: ClientViewModel
let itemsViewModels: [ItemViewModel]
init(purchase: Purchase) {
self.clientViewModel = ClientViewModel(client:purchase.client)
self.itemsViewModels = purchase.items.map { ItemViewModel(item:$0) }
}
如果您有需要一些不相關模型的視圖層次結構,那么您可以考慮使用環境,特別是對於“全局”模型
例如,假設用戶正在查看項目詳細信息,但他們還沒有進行購買(因此還沒有Purchase
),並且您希望有一個按鈕向他們顯示他們的Client
詳細信息。
您可以將ItemViewModel
顯式傳遞給ItemDetailView
:
struct ItemListView {
...
Button(action: { ItemDetailView(item:someItemView) })
{ ... }
}
struct ItemDetailView {
...
Button(action: { ClientView() }) {
Text("Client detail")
}
}
struct ClientDetailView {
@EnvironmentObject client: ClientViewModel
...
}
您可以在合適的位置將ClientViewModel
注入到環境中,例如根視圖甚至場景委托。
如果您有需要這些模型的視圖層次結構,但並非所有視圖都需要所有模型,您可以使用環境來提供各種模型,而不是通過初始化參數直接注入它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.