我有一个基于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?
谢谢。
答案 0 :(得分:1)
我建议您为模型简单地创建两个子类:
class NaughtyList: SantaListModel {
init() {
super.init(title: "Naughty")
}
}
class NiceList: SantaListModel {
init() {
super.init(title: "Nice")
}
}
这样做,两个列表都可以存储在环境中而不会发生冲突。 SwiftUI唯一可以区分环境对象的是按类。因此,拥有单独的类很重要。