SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)

Posted

技术标签:

【中文标题】SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)【英文标题】:SwiftUI -> Thread 1: Fatal error: No observable object of type MyObject.Type found (EnvironmentObject in sheet) 【发布时间】:2019-12-26 05:05:54 【问题描述】:

我正在使用 SwiftUI 构建一个应用程序。当我尝试显示工作表(以前是模态)时,出现以下错误消息:

Thread 1: Fatal error: No observable object of type BixiStationCombinedListViewModel.Type found.
A View.environmentObject(_:) for BixiStationCombinedListViewModel.Type may be missing as an ancestor of this view.

当我使用 @State 变量显示包含 Map View 的模式时,会发生此错误。

我不明白为什么以及如何实施新的Environment Object

是因为我在点击CardView 时选择的Station 应该全局存储并且信息应该传递给专用的View

View 处理@State

struct CardView: View 
    
    @EnvironmentObject var bixiModel: BixiStationCombinedListViewModel
    @State private var isModalOpen: Bool = false
        
    var station: BixiStationCombinedViewModel
        
    var body: some View 
        
        ZStack(alignment: .leading) 
            
                Card()
                
                StationTextInfo(station: station)

         .onTapGesture 
            self.isModalOpen = true
            print(self.isModalOpen)
        
        .sheet(isPresented: self.$isModalOpen) 
            BixiStationDetailView(station: self.station)
        

    

View 我试图在工作表中显示:

struct BixiStationDetailView: View 
    
    @EnvironmentObject var bixiModel: BixiStationCombinedListViewModel
        
    var station: BixiStationCombinedViewModel
    
    var body: some View 
        VStack 
            MapView(coordinate: station.coordinate, name: station.name)        
        
    

最后是对象:

class BixiStationCombinedListViewModel: ObservableObject 
    
    init() 
        fetchDataFromApi()
    
    
    @Published var stationsCombinedList = [BixiStationCombinedViewModel]()
    
    var stationsInformationList = [BixiStationInformationViewModel]()
    var stationsDataList = [BixiStationDataViewModel]()
        
    func fetchDataFromApi() 

                
    

我怎样才能摆脱错误消息并显示正确的View

【问题讨论】:

【参考方案1】:

你必须将你的环境对象传递给BixiStationDetailView,否则它将没有任何东西可以绑定到它的@EnvironmentObject

.sheet(isPresented: self.$isModalOpen) 
    BixiStationDetailView(station: self.station)
        .environmentObject(self.bixiModel)

由于您将BixiStationDetailView 呈现为工作表,因此它不是您的CardView 的子视图,因此不会继承其@EnvironmentObject

【讨论】:

感谢它运行良好!之前我直接在视图中加了@EnvironmentObject,觉得就够了……但事实并非如此。 我遇到了同样的错误,因为我在init() 中使用了@EnvironmentObject 注释对象。环境对象只有在初始化成功后才可用。 我刚碰到这个。我假设由于呈现的工作表是一个新的层次结构,它不会在环境中传递。 我刚刚在NavigationLink 遇到了这个问题。将它添加到父视图是不够的,我必须将修饰符添加到导航链接的 destination: 参数。不是很直观。

以上是关于SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 致命错误:未找到“”类型的 ObservableObject

SwiftUI - 使用“pushViewController”时出现致命错误

致命错误:@SceneStorage 仅用于 SwiftUI 应用程序生命周期。:文件 SwiftUI,第 0 行

从数组中删除 - 致命错误:索引超出范围 - SwiftUI 绑定

SwiftUI - 致命错误:每个布局项只能出现一次:文件 SwiftUI,第 0 行

为啥我的 SwiftUI JSONDecoder 会出现致命错误?