You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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找不到有效实例。

解决方案步骤

  1. 移除ContentView中多余的环境对象注入
    删掉ContentView里CompareView().environmentObject(Devices())的.environmentObject(Devices()),因为CompareView已经通过@StateObject创建并持有了自己的Devices实例,不需要外部再传入新的实例。

  2. 给跳转的子视图注入正确的实例
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:25:18