Swiftui 模型、列表视图和详细视图
我试图理解SwiftUI,并在头脑中有一个简单的应用程序来帮助我学习。我的应用程序有一个模型和两个视图,如下所示 第一个问题很具体:如何让“更新锦标赛”发挥作用?我不知道应该绑定到哪个变量(如果有的话),或者这是否是正确的方法Swiftui 模型、列表视图和详细视图,swiftui,Swiftui,我试图理解SwiftUI,并在头脑中有一个简单的应用程序来帮助我学习。我的应用程序有一个模型和两个视图,如下所示 第一个问题很具体:如何让“更新锦标赛”发挥作用?我不知道应该绑定到哪个变量(如果有的话),或者这是否是正确的方法 struct Tournament { // eventually will have more properties, such as Bool, Date, arrays, etc. var name: String var location: Str
struct Tournament { // eventually will have more properties, such as Bool, Date, arrays, etc.
var name: String
var location: String = "Franchises"
#if DEBUG
var tournamentData = [
Tournament(name: "Season Opener"),
Tournament(name: "May Day Tournament"),
Tournament(name: "Memorial Day Tournament"),
Tournament(name: "School's Out Tournament")
]
#endif
}
(另一方面,我删除了第二个问题,关于我的代码是好是坏,还是我没有以“快捷方式”做事,因为我的问题已经结束(“这将帮助其他人回答问题”我的左脚!)我问了一个非常具体的问题,但我也借此机会问我的方法是否合理。这不应该是管理警察的事情,特别是因为我得到的一个回答实际上回答了我的一个问题我没有问,但考虑过,也就是预告片。所以,让我直截了当地说:我只能问一个问题,否则我会被制裁,但人们可以回答比被问的更多的问题;他们只需要有洞察力。这太疯狂了。我想我得到的回答体现了人们帮助人们,甚至付出更多努力的好处。我的seco第二个问题显然更一般,不会让任何阅读我的问题的人感到困惑。)首先,您应该记住,您只有一个真理来源来驱动整个应用程序。这个真相的来源将作为
环境对象
传递。所以你所有的tournamentData
都将在这个类中。例如:
final class DataStore : ObservableObject{
#if DEBUG
@Published var tournamentData = [
Tournament(name: "Season Opener"),
Tournament(name: "May Day Tournament"),
Tournament(name: "Memorial Day Tournament"),
Tournament(name: "School's Out Tournament")
]
#else
@Published var tournamentData = [Tournament]()
#endif
}
这应该从您的顶层视图传递
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(DataStore())
}
}
只需从每个子视图中访问它
@EnvironmentObject var store : DataStore
然后,您应该只更新这个单一的真相来源和其中的tournamentData
。一切都应按预期进行
我推荐看苹果的WWDC SwiftUI视频。他们解释得很好。或者,如果您想先进行更多的实践,请阅读本教程。真是太神奇了
编辑:为了完成,我想我应该添加处理调试的正确方法。上面的方法会起作用,但您真正应该做的是在PreviewProvider
中指定调试模型。无论如何,苹果都会将其从生产代码中删除
因此,在您的视图中
:
struct Listing_Previews: PreviewProvider {
static var previews: some View {
let store = DataStore()
store.tournamentData = [
Tournament(name: "Season Opener"),
Tournament(name: "May Day Tournament"),
Tournament(name: "Memorial Day Tournament"),
Tournament(name: "School's Out Tournament")
]
return Listing().environmentObject(store)
}
}
并从数据存储中删除#if DEBUG
,谢谢。我明天早上去试试。我同意苹果教程的精彩之处,实际上我要为我的UserProfileView窃取LandmarksDetailView的布局我看过WWDC的视频,但其中一些不适合使用,特别是因为SwiftUI的发展如此之快。感谢您提供有关PreviewProvider
和调试数据的额外信息。这是我要问的问题,但我忘了问。我也要试试!
@EnvironmentObject var store : DataStore
struct Listing_Previews: PreviewProvider {
static var previews: some View {
let store = DataStore()
store.tournamentData = [
Tournament(name: "Season Opener"),
Tournament(name: "May Day Tournament"),
Tournament(name: "Memorial Day Tournament"),
Tournament(name: "School's Out Tournament")
]
return Listing().environmentObject(store)
}
}