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())放在了任何需要它的地方,现在我完全不知道该怎么做。
任何帮助将不胜感激!
1条答案
按热度按时间t40tm48m1#
我想我知道了!
here这篇文章让我意识到我的问题是我试图在init()中访问我的modelData,但在那里还不可能。
当调用主体时,环境被传递,因此在View结构体的初始化阶段,它还不存在。
因此,我通过移动来解决问题
if (!modelData.clubs.isEmpty) { clubs = modelData.clubs }
从
init()
转换到它自己的函数中,然后在我的NavigationView
的onAppear
中调用该函数。