簡體   English   中英

SwiftUI 2 View Models in a View

[英]SwiftUI 2 View Models in a View

我有這個觀點,它以自己的觀點 Model 作為參數。 在這個視圖中,我需要顯示另一個視圖,為了顯示它,需要它自己的視圖 Model。 所以我展示了Purchase視圖,然后在Purchase視圖中我需要顯示購買的實際項目的詳細信息。 所以我也將ItemViewModel作為參數傳遞。 PurchaseViewModelItemViewModel也用於其他視圖。

它可能發生在我還需要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包含ItemViewModelClientViewModel作為屬性,就像PurchaseView包含ItemViewClientView一樣。

這將使PurchaseViewModel負責創建其他視圖模型的實例。 PurchaseView的父級不再需要了解PurchaseView的實現。

您應該首先考慮模型的關系,而不是視圖模型

例如,您可以假設Purchase涉及一個或多個項目 ( Item ) 和購買者 ( Client )。 在這種情況下,您實際上會創建一個 model 類似於:

class Purchase {
    var items = [Item]()
    var client: Client
    ...
}

您的PurchaseViewModel將反映這一點,包含ItemViewModelClientViewModel

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM