SwiftUI->线程1:致命错误:找不到类型MyObject.Type的可观察对象

Day*_*502 8 fatal-error observable ios swift swiftui

我正在使用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.
Run Code Online (Sandbox Code Playgroud)

当我使用@State变量来显示包含使用MapKit的“地图视图”的模式时,会发生此错误。

我是Swift编程和SwiftUI的新手。该错误消息可能对您很清楚,但对我而言却不是。

我不知道为什么以及如何实现新的环境对象。

是因为station我在点击时选择的CardView 应该被全局存储并将信息传递到专用视图吗?

采取的观点 @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)
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在工作表中显示的视图

struct BixiStationDetailView: View {

    @EnvironmentObject var bixiModel: BixiStationCombinedListViewModel

    var station: BixiStationCombinedViewModel

    var body: some View {
        VStack {
            MapView(coordinate: station.coordinate, name: station.name)        
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后的对象

class BixiStationCombinedListViewModel: ObservableObject {

    init() {
        fetchDataFromApi()
    }

    @Published var stationsCombinedList = [BixiStationCombinedViewModel]()

    var stationsInformationList = [BixiStationInformationViewModel]()
    var stationsDataList = [BixiStationDataViewModel]()

    func fetchDataFromApi() {

        }        
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以得到错误消息并显示正确的视图吗?

谢谢大家!

gra*_*ell 16

您必须将环境对象传递给BixiStationDetailView,否则它将没有任何绑定@EnvironmentObject

.sheet(isPresented: self.$isModalOpen) {
    BixiStationDetailView(station: self.station)
        .environmentObject(self.bixiModel)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我得到了同样的错误,因为我在 `init()` 中使用了 `@EnvironmentObject` 带注释的对象。环境对象仅在成功初始化后才可用。 (15认同)
  • 我刚刚在“NavigationLink”中遇到了这个问题。将其添加到父视图还不够,我必须将修饰符添加到导航链接的“destination:”参数中。不是很直观。 (3认同)
  • 我刚刚遇到了这个。我认为由于所提供的工作表是一个新的层次结构,因此它不会沿着环境传递。 (2认同)