SwiftUI报错Thread 1:未找到Variables类型ObservableObject求助
解决SwiftUI中"找不到Variables类型的ObservableObject"错误
错误原因解析
你遇到的这个错误直白点说:用@EnvironmentObject声明storage的AddToScore视图,在它的父视图层级里找不到Variables类型的ObservableObject实例。
问题出在你的ContentView代码里:你把AddToScore()直接放在了VStack外面,而environmentObject(storage)是附加在VStack上的——这意味着只有VStack内部的子视图能拿到这个环境对象,VStack外面的AddToScore根本不在这个环境范围内,自然找不到需要的Variables实例。
修复方案
有两种简单的修复方式:
方式一:把AddToScore放到VStack内部
直接将AddToScore()移到添加了environmentObject的VStack里,这样它就能继承到环境对象:
import SwiftUI struct ContentView: View { @StateObject var storage = Variables() var body: some View { VStack { AddToScore() // 移到VStack内部 Button("remove points") { storage.score -= 1 } Text("text text etxt dfahjadfbadful") }.environmentObject(storage) } } struct AddToScore: View { @EnvironmentObject var storage: Variables var body: some View { VStack { Text("Point generator") .font(.title) HStack { Button("Get points!") { storage.score += 1 } Text("\(storage.score)") } } } } class Variables: ObservableObject { @Published var score = 0 } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
方式二:给AddToScore单独添加environmentObject
如果不想调整布局,也可以直接给AddToScore单独附加环境对象:
struct ContentView: View { @StateObject var storage = Variables() var body: some View { AddToScore() .environmentObject(storage) // 单独添加环境对象 VStack { Button("remove points") { storage.score -= 1 } Text("text text etxt dfahjadfbadful") }.environmentObject(storage) } }
补充说明
使用@EnvironmentObject时要记住:必须在该视图的任意父视图上通过environmentObject(_:)注入对应的ObservableObject实例,且这个父视图必须在当前视图的层级链里。
内容的提问来源于stack exchange,提问作者oosh
相关产品推荐
相关产品推荐

