web-dev-qa-db-fra.com

SwiftUI -> Thread 1: Fatal error: Aucun objet observable de type MyObject.Type trouvé

Je crée une application avec SwiftUI. Lorsque j'essayais d'afficher une feuille (auparavant Modal), ce message d'erreur apparaît:

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.

Cette erreur se produit lorsque j'utilise un @State variable pour afficher un modal qui inclut une vue de carte à l'aide de MapKit.

Je suis nouveau à Swift Programmation et SwiftUI. Le message d'erreur peut être clair pour vous, mais pas vraiment pour moi.

Je ne vois pas pourquoi et comment je devrais implémenter un nouvel objet environnement.

Est-ce parce que le station que je sélectionne lorsque je tape sur le CardView doit être stocké globalement et transmettre les informations à la vue dédiée?

La vue prise en manipulant le @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)
        }

    }
}

La vue que j'essaie de montrer dans la feuille

struct BixiStationDetailView: View {

    @EnvironmentObject var bixiModel: BixiStationCombinedListViewModel

    var station: BixiStationCombinedViewModel

    var body: some View {
        VStack {
            MapView(coordinate: station.coordinate, name: station.name)        
        }
    }
}

Enfin l'objet

class BixiStationCombinedListViewModel: ObservableObject {

    init() {
        fetchDataFromApi()
    }

    @Published var stationsCombinedList = [BixiStationCombinedViewModel]()

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

    func fetchDataFromApi() {

        }        
    }
}

Puis-je me débarrasser du message d'erreur et afficher la vue appropriée?

Merci a tous!

19
Daymo502

Vous devez passer votre objet d'environnement à BixiStationDetailView, sinon il n'aura rien à lier à son @EnvironmentObject.

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

Puisque vous présentez BixiStationDetailView sous forme de feuille, ce n'est pas une sous-vue de votre CardView et n'hérite donc pas de son @EnvironmentObject.

30
graycampbell