SwiftUI EnvironmentObject报错:未找到Devices类型ObservableObject
解决“找不到Devices类型的ObservableObject”致命错误
你遇到的致命错误 Fatal error: No ObservableObject of type Devices found. A View.environmentObject(_:) for Devices may be missing as an ancestor of this view,核心原因是视图层级中没有正确传递同一个Devices实例,导致子视图Device1View无法从环境中找到对应的ObservableObject。
代码问题分析
CompareView内部通过@StateObject var device = Devices()创建了一个Devices实例,但你同时在ContentView里给CompareView附加了.environmentObject(Devices()),这会生成另一个全新的Devices实例,两者完全独立。- 跳转至
Device1View时,没有将CompareView持有的device实例注入到环境中,导致Device1View的@EnvironmentObject var device: Devices找不到有效实例。
解决方案步骤
移除ContentView中多余的环境对象注入
删掉ContentView里CompareView().environmentObject(Devices())的.environmentObject(Devices()),因为CompareView已经通过@StateObject创建并持有了自己的Devices实例,不需要外部再传入新的实例。给跳转的子视图注入正确的实例
在CompareView的NavigationLink中,给目标视图Device1View附加当前的device实例作为环境对象。
修改后的ContentView代码
import SwiftUI struct CustomColor{ static let myColor = Color("mycolour") } struct ContentView: View { var body: some View { NavigationView{ CompareView() // 移除多余的.environmentObject(Devices()) } } }
修改后的CompareView代码
import SwiftUI class Devices: ObservableObject{ @Published var selectedDevice1 = iPhone.sampleiPhone @Published var selectedDevice2 = iPhone.sampleiPhone } struct CompareView: View { @Environment(\.colorScheme) var colorScheme @StateObject var device = Devices() var iPhones: [iPhone] = iPhone.allIphones let columns = [ GridItem(.adaptive(minimum: 200, maximum: 250)), GridItem(.adaptive(minimum: 200, maximum: 250)) ] var body: some View { ZStack(alignment: .top){ ScrollView{/* 原有内容 */} .padding(.top, 55) HStack(alignment: .center, spacing: 10){ // 给Device1View注入当前的device实例 NavigationLink(destination: Device1View().environmentObject(device)) { Text(device.selectedDevice1.model) } Divider() } .frame(height: 50) .background(CustomColor.myColor) .cornerRadius(25) .shadow(radius: 8, x: 5, y: 5) } } }
Device1View代码(保持原有即可)
import SwiftUI struct Device1View: View { var iPhones: [iPhone] = iPhone.allIphones @EnvironmentObject var device: Devices var body: some View { Form{ ForEach(iPhones, id: \.self){phone in Button(phone.model){ // 建议修改为实际赋值逻辑:device.selectedDevice1 = phone _ = device.selectedDevice1 } } } } }
修改后,CompareView持有的device实例会被正确传递给Device1View,确保整个视图层级中使用的是同一个Devices实例,解决找不到ObservableObject的错误。
内容的提问来源于stack exchange,提问作者Paul Bovtach
相关产品推荐
相关产品推荐

