在SwiftUI中将变量从一个视图传递到另一个视图时,环境变量不起作用

在SwiftUI中将变量从一个视图传递到另一个视图时,环境变量不起作用,swiftui,swiftui-environment,Swiftui,Swiftui Environment,我发现了一些类似的例子,说明了如何在SwiftUI中的多个视图之间传递变量: 我尝试按照示例使用EnvironmentVariables并修改ContentView,它是在SceneDelegate中首次定义的。但是,在尝试这两个示例时,我得到错误“编译失败:'ContentView_Previews'不是'Environment'的成员类型”。我使用的是Xcode版本11.3.1 按照中给出的示例,以下是ContentView中包含的代码: class SourceOfTruth: Obs

我发现了一些类似的例子,说明了如何在SwiftUI中的多个视图之间传递变量:

  • 我尝试按照示例使用EnvironmentVariables并修改ContentView,它是在SceneDelegate中首次定义的。但是,在尝试这两个示例时,我得到错误“编译失败:'ContentView_Previews'不是'Environment'的成员类型”。我使用的是Xcode版本11.3.1

    按照中给出的示例,以下是ContentView中包含的代码:

    class SourceOfTruth: ObservableObject{
        @Published var count = 0
    }
    
    struct ContentView: View {
        @EnvironmentObject var truth: SourceOfTruth
        var body: some View {
            VStack {
                FirstView()
                SecondView()
            }
        }
    }
    
    struct FirstView: View {
        @EnvironmentObject var truth: SourceOfTruth
        var body: some View {
           VStack{
            Text("\(self.truth.count)")
               Button(action:
                {self.truth.count = self.truth.count-10})
               {
                   Text("-")
               }
           }
        }
    }
    
    struct SecondView: View {
        @EnvironmentObject var truth: SourceOfTruth
        var body: some View {
            Button(action: {self.truth.count = 0}) {
                Text("Reset")
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView().environmentObject(SourceOfTruth())
        }
    }
    
    。。。以下是SceneDelegate的内容:

    import UIKit
    import SwiftUI
    
    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
        var window: UIWindow?
        var truth = SourceOfTruth() // <- Added
    
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        //    let contentView = ContentView()
            if let windowScene = scene as? UIWindowScene {
                let window = UIWindow(windowScene: windowScene)
                window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(SourceOfTruth())) // <- Modified
                self.window = window
                window.makeKeyAndVisible()
            }
        }
        func sceneDidDisconnect(_ scene: UIScene) {
        }
        func sceneDidBecomeActive(_ scene: UIScene) {
        }
        func sceneWillResignActive(_ scene: UIScene) {
        }
        func sceneWillEnterForeground(_ scene: UIScene) {
        }
        func sceneDidEnterBackground(_ scene: UIScene) {
        }
    }
    
    导入UIKit
    导入快捷键
    类SceneDelegate:UIResponder,UIWindowSceneDelegate{
    变量窗口:UIWindow?
    
    var truth=SourceOfTruth()/I不依赖于Xcode版本,这不是问题。您必须在
    ContentView\u预览中设置
    ContentView
    ,方法与在
    SceneDelegate
    中相同,提供
    .environmentObject
    ,如下示例所示

    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView().environmentObject(_Your_object_here())
        }
    }
    

    非常感谢!我尝试按照建议在
    ContentView\u Previews
    中设置
    ContentView
    ,但我仍然收到相同的错误。我修改了帖子以包含结构的代码和
    SceneDelegate
    以获取更多信息。我无法重现您的问题。它按预期工作(版本11.3.1)(11C504))