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