将相同模型的不同实例传递到相同的SwiftUI View结构

时间:2019-12-16 16:07:57

标签: swift swiftui

我有一个基于Tab的应用程序,该应用程序在Swift中使用SwiftUI实现。

对于其中的两个选项卡,我想显示基于相同SwiftUI结构的列表,显示同一类的不同实例。

在SceneDelegate中,

    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实现以显示不同的实例)时,该计划就出错了。

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?

谢谢。

1 个答案:

答案 0 :(得分:1)

我建议您为模型简单地创建两个子类:

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

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

这样做,两个列表都可以存储在环境中而不会发生冲突。 SwiftUI唯一可以区分环境对象的是按类。因此,拥有单独的类很重要。