簡體   English   中英

將同一模型的不同實例傳遞給同一 SwiftUI 視圖結構

[英]Passing different instances of same Model to same SwiftUI View struct

我有一個基於 Tab 的應用程序,在 Swift 中實現,並使用 SwiftUI。

對於其中的 2 個選項卡,我想顯示基於相同 SwiftUI 結構的列表,顯示同一類的不同實例。

在場景委托中,

    let naughtyModel = SantaListModel(title: "Naughty")
    let niceModel    = SantaListModel(title: "Nice")

    // Create the SwiftUI view that provides the window contents.
    let contentView = ContentView()
        .environmentObject(naughtyModel)
        .environmentObject(niceModel)

    ...

然后,

struct ContentView: View {
    @State private var selection = 0

    @EnvironmentObject var naughtyModel: SantaList
    @EnvironmentObject var niceModel: SantaList

    var body: some View {
        TabView(selection: $selection){
            SantaListView().environmentObject(naughtyModel)
                .font(.title)
                .tabItem {
                    VStack {
                        Text(naughtyModel.title)
                    }
                }
                .tag(0)
            SantaListView().environmentObject(niceModel)
                .font(.title)
                .tabItem {
                    VStack {
                        Text(niceModel.title)
                    }
                }
                .tag(1)
            }
        }
   }

到目前為止一切似乎都很好,但是當我實現 SantaListView(一個顯示不同實例的共享結構實現)時,計划出錯了......

struct SantaListView: View {

    @EnvironmentObject var santaListModel: SantaList // <<< the problem: naughty or nice?

    var body: some View {
        NavigationView() {
            VStack {
            }
           .navigationBarTitle(Text(santaListModel.title))
        }
    }
}

在 SantaList 類實現中,如何引用特定的@EnvironmentVariable,使得上面的 santaListModel 引用特定的實例 naughtyModel 或 niceModel?

提前致謝。

我建議您簡單地為模型創建兩個子類:

class NaughtyList: SantaListModel {
  init() {
    super.init(title: "Naughty")
  }
}

class NiceList: SantaListModel {
  init() {
    super.init(title: "Nice")
  }
}

通過這樣做,兩個列表都可以存儲在環境中而不會發生沖突。 SwiftUI 唯一需要區分環境對象的是類。 因此,擁有單獨的類很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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