未找到ModelData类型的ObservableObject:缺少environmentObject,但environmentObject实际存在(SwiftUI、Xcode)

jv2fixgn  于 2023-02-18  发布在  Swift
关注(0)|答案(1)|浏览(177)

Xcode版本:14.2
我正在尝试显示一个体育俱乐部列表。由于我的modelData. clubs在查看预览时仍然是一个空数组(当应用加载时,modelData. clubs在我的contentView中获得其实际值),因此我希望它在modelData. clubs. isEmpty时显示一个默认俱乐部数组。但是,当我尝试运行代码时,它在标记行中给出了以下错误:Thread 1: Fatal error: No ObservableObject of type ModelData found. A View.environmentObject(_:) for ModelData may be missing as an ancestor of this view.

struct ClubList: View {
    @EnvironmentObject var modelData: ModelData
    @State private var sortByValue = false
    var clubs: [Club] = [Club.default, Club.default, Club.default, Club.default, Club.default]
    
    init() {
        if (!modelData.clubs.isEmpty) { // ERROR IN THIS LINE
            clubs = modelData.clubs
        }
        
        if sortByValue {
            clubs.sort {
                $0.value < $1.value
            }
        } else {
            clubs.sort {
                $0.name < $1.name
            }
        }
    }
        
    var body: some View {
        NavigationView {
            List {
                ForEach(clubs) { club in
                    NavigationLink {
                        ClubDetail(club: club)
                    } label: {
                        ClubRow(club: club)
                    }
                }
            }
        }
    }
}

struct ClubList_Previews: PreviewProvider {
    static var previews: some View {
        ClubList()
            .environmentObject(ModelData())
    }
}

ClubList()在我的ContentView中被调用:

struct ContentView: View {
    @EnvironmentObject var modelData: ModelData
    // ... //
    
    var body: some View {
        if clubsLoaded {
            ClubList()
                .environmentObject(ModelData())
        } // ... //
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(ModelData())
    }
}

ContentView在我的应用程序中调用:

@main
struct clubsApp: App {
    @StateObject private var modelData = ModelData()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(modelData)
        }
    }
}

我对Xcode还是个新手,但我认为我把environmentObject(ModelData())放在了任何需要它的地方,现在我完全不知道该怎么做。
任何帮助将不胜感激!

t40tm48m

t40tm48m1#

我想我知道了!
here这篇文章让我意识到我的问题是我试图在init()中访问我的modelData,但在那里还不可能。
当调用主体时,环境被传递,因此在View结构体的初始化阶段,它还不存在。
因此,我通过移动来解决问题
if (!modelData.clubs.isEmpty) { clubs = modelData.clubs }
init()转换到它自己的函数中,然后在我的NavigationViewonAppear中调用该函数。

相关问题