Swiftui 模型、列表视图和详细视图

Swiftui 模型、列表视图和详细视图,swiftui,Swiftui,我试图理解SwiftUI,并在头脑中有一个简单的应用程序来帮助我学习。我的应用程序有一个模型和两个视图,如下所示 第一个问题很具体:如何让“更新锦标赛”发挥作用?我不知道应该绑定到哪个变量(如果有的话),或者这是否是正确的方法 struct Tournament { // eventually will have more properties, such as Bool, Date, arrays, etc. var name: String var location: Str

我试图理解SwiftUI,并在头脑中有一个简单的应用程序来帮助我学习。我的应用程序有一个模型和两个视图,如下所示

第一个问题很具体:如何让“更新锦标赛”发挥作用?我不知道应该绑定到哪个变量(如果有的话),或者这是否是正确的方法

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)
    }
}