Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 无法在视图之间共享环境_Swiftui_Combine - Fatal编程技术网

Swiftui 无法在视图之间共享环境

Swiftui 无法在视图之间共享环境,swiftui,combine,Swiftui,Combine,环境:Xcode版本11.0 beta 4(11M374r) 我无法与第二个视图共享“环境” 我已在SceneDelegate中实例化了环境BindableObject: SceneDelegate.swift: 我在基本视图(ContentView)和详细视图中使用@EnvironmentObject。 该环境已在SceneDelegate中设置,因此应可供所有视图使用。 ContentView确实可以看到环境 但DetailView爆炸了: 以下是完整的代码: import

环境:Xcode版本11.0 beta 4(11M374r) 我无法与第二个视图共享“环境”

我已在SceneDelegate中实例化了环境BindableObject:

SceneDelegate.swift:

我在基本视图(ContentView)和详细视图中使用@EnvironmentObject。
该环境已在SceneDelegate中设置,因此应可供所有视图使用。 ContentView确实可以看到环境
但DetailView爆炸了:

以下是完整的代码:

import Combine
import SwiftUI

struct UserInfo {
    var name: String
    var message: String
    init(name: String, msg: String) {
        self.name = name; self.message = msg
    }
}

// A BindableObject is always a class; NOT a struct.
class UserSettings: BindableObject {
    let willChange = PassthroughSubject<Void, Never>()
    var userInfo = UserInfo(name: "Ric", msg: "Mother had a feeling, I might be too appealing.") {
        didSet {
            willChange.send()
        }
    }
}

// =====================================================================================================

struct DetailView: View {
    @Binding var dismissFlag: Bool
    @EnvironmentObject var settings: UserSettings  // ...<error source>

    var body: some View {
        VStack {
            Spacer()
            Button(action: dismiss) {
                Text("Dismiss")
                    .foregroundColor(.white)
            }
            .padding()
            .background(Color.green)
            .cornerRadius(10)
            .shadow(radius: 10)

            Text("Hello")
            Spacer()
        }
    }

    private func dismiss() {
        settings.userInfo.message = "Rubber baby buggy bumpers."
        dismissFlag = false
    }
}

// ---------------------------------------------------------------------------
// Base View:

struct ContentView: View {
    @State var shown = false
    @EnvironmentObject var settings: UserSettings

    var body: some View {
        VStack {
            Spacer()
            Button(action: {
                self.settings.userInfo.name = "Troglodyte"
                self.settings.userInfo.message = "Top Secret"
                self.shown.toggle()
            }) {
                Text("Present")
                    .foregroundColor(.white)
            }.sheet(isPresented: $shown) { DetailView(dismissFlag: self.$shown) }
                .padding()
                .background(Color.red)
                .cornerRadius(10)
                .shadow(radius: 10)
            Text(self.settings.userInfo.message)
            Spacer()
        }
    }
}

// =====================================================================================================

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif
修改ScenedLegate后,他将显示运行时错误消息:


这里有一个线索:

SceneDelegate
中,您需要声明变量的实例:

var userSettings = UserSettings()  // <<--- ADD THIS


func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: ContentView()
            .environmentObject(userSettings)  <<-- CHANGE THIS
        )
        self.window = window
        window.makeKeyAndVisible()
    }
}

根据你的建议做了改变。但我仍然得到运行时错误,这是一个不同的运行时错误。我不使用预览,所以请给我几分钟时间,我将编辑我的答案。请参阅我编辑的答案以修复第二个问题。现在我知道为什么我没有花太多时间在预览上了。:-)
var userSettings = UserSettings()  // <<--- ADD THIS


func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: ContentView()
            .environmentObject(userSettings)  <<-- CHANGE THIS
        )
        self.window = window
        window.makeKeyAndVisible()
    }
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(UserSettings())
}
}
#endif