0

SwiftUI でアプリを作成しましたが、ボタンを表示しようとすると、次のエラー メッセージが表示されます。

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

これ@EnvironmentObjectは、アプリのビューの 1 つを表示しようとするときに を使用しようとすると発生します。

私のコードは

struct OpportunityDetail: View {
    @EnvironmentObject var modelData: ModelData
    var opportunity: Opportunity
    
    var opportunityIndex: Int {
            modelData.opportunities.firstIndex(where: { $0.id == opportunity.id })!
        }
    
    
    var body: some View {
        ScrollView {
            
            MapView(coordinate: opportunity.locationCoordinate)
                .frame(height: 300)
                .ignoresSafeArea(edges: .top)
            
            CircleImage(opportunity: opportunity)
                .offset(y: -130)
                .padding(.bottom, -130)
            
            
            VStack {
                VStack(alignment: .leading) {
                    Text(opportunity.position)
                        .font(.title)
                    HStack {
                        Text(opportunity.name)
                            .font(.subheadline)
                        Spacer()
                        Text(opportunity.city)
                            .font(.subheadline)
                    }
                    .font(.subheadline)
                    .foregroundColor(.secondary)
                    
                    Divider()
                    Text("About the Opportunity")
                        .font(.title2)
                        Text(opportunity.description)
                    ApplyButton(isSet: $modelData.opportunities[opportunityIndex].isApplied)
                }
                .padding()
            }
        }
        .navigationTitle(opportunity.name)
        .navigationBarTitleDisplayMode(.inline)
    }
}

ただし、ビューのプレビューとライブ プレビューは正常に機能します。


struct OpportunityDetail_Previews: PreviewProvider {
    
    static let modelData = ModelData()
    
    static var previews: some View {
        OpportunityDetail(opportunity: modelData.opportunities[0])
            .environmentObject(modelData)
    }
}

環境オブジェクトをどこかに渡す必要があることはわかっていますが、方法がわかりません。誰の助けにも感謝します。

4

1 に答える 1

1

New Devが言ったように、それが私のすべてのサブビューのルートビューだったので、私の問題は解決され.environmentObject(modelData)ました:ContentView

プレビューの場合と同様に、ビュー階層のどこかで .environmentObject(modelData) を使用する必要があります。たとえば、OpportunityDetail の親ビューで実行することも、ルート レベルで作成することもできます。たとえば、ContentView がルート ビューである場合は、そこに設定できます。

于 2021-03-02T01:15:41.243 に答える