SwiftUI -> 线程1:致命错误:未找到类型为MyObject的可观察对象(在sheet中的EnvironmentObject)

62

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

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变量显示包含MapKit Map View 的模态窗口时,会出现此错误。

我不明白为什么需要实现新的Environment Object

是因为当我点击CardView上的Station时,应该将其全局存储并将信息传递到专用的View中吗?

处理@StateView

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)
        }

    }
}

我试图在 sheet 中显示的 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个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
102
您需要将您的环境对象传递给BixiStationDetailView,否则它将无法绑定到其@EnvironmentObject
.sheet(isPresented: self.$isModalOpen) {
    BixiStationDetailView(station: self.station)
        .environmentObject(self.bixiModel)
}

由于您将BixiStationDetailView展示为一个sheet,它不是CardView的子视图,因此不会继承其@EnvironmentObject


谢谢,它完美地工作了!之前我直接在视图中添加了@EnvironmentObject,认为这就足够了...但事实并非如此。 - Daymo502
25
因为我在init()中使用了标记为@EnvironmentObject的对象,所以我遇到了相同的错误。 环境对象只有在成功初始化后才可用。 - mohit kejriwal
3
我刚遇到了这个问题。我认为,由于所呈现的表格是一个新层次结构,它没有传递环境。 - Michael Ozeryansky
2
我刚遇到了NavigationLink的这个问题。将其添加到父视图中是不够的,我还必须将修改器添加到导航链接的destination:参数中。这并不是很直观。 - Big_Chair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,