I'm getting this Fatal Error for the listViewModel
. Do I add the @ObservableObject var listViewModel: MakeMyOwnListViewModel
to the MakeMyOwnListView.swift
or ManifestationMenuApp.swift
file?
Thread 1: Fatal error: No ObservableObject of type MakeMyOwnListViewModel found. A View.environmentObject(_:) for MakeMyOwnListViewModel may be missing as an ancestor of this view.
I'm confused about my understanding of ObservableObject and environmentObject any direction would be great.
MakeMyOwnListView.swift
import SwiftUI
struct MakeMyOwnListView: View {
@EnvironmentObject var listViewModel: MakeMyOwnListViewModel
// @ObservableObject var listViewModel: MakeMyOwnListViewModel
var body: some View {
ZStack {
if listViewModel.items.isEmpty {
MakeMyOwnNoItemsView()
.transition(AnyTransition.opacity.animation(.easeIn))
} else {
List {
ForEach(listViewModel.items) { item in
MakeMyOwnListRowView(item: item)
.onTapGesture {
listViewModel.updateItem(item: item)
}
}
.onDelete(perform: listViewModel.deleteItem)
.onMove(perform: listViewModel.moveItem)
}
.listStyle(PlainListStyle())
}
}
// Navigation Title
.navigationTitle("Make My Own ✍")
// Navigation Butons
.navigationBarItems(
leading: EditButton(),
trailing:
NavigationLink("Add", destination:
MakeMyOwnAddView())
)
}
}
struct MakeMyOwnListView_Previews: PreviewProvider {
static var previews: some View {
// Add NavigationView now we have the same environment in realtime when we are running our App
NavigationView {
MakeMyOwnListView()
}
.environmentObject(MakeMyOwnListViewModel())
}
}
ManifestationMenuApp.swift
import SwiftUI
@main
struct ManifestationMenuApp: App {
@AppStorage("isOnboarding") var isOnboarding: Bool = true
@StateObject var listViewModel: MakeMyOwnListViewModel = MakeMyOwnListViewModel()
// @ObservableObject var listViewModel: MakeMyOwnListViewModel
// @EnvironmentObject var _listViewModel: MakeMyOwnListViewModel
var body: some Scene {
WindowGroup {
if isOnboarding {
OnboardingView()
} else {
MainView()
.environmentObject(MenuListFriendshipViewModel())
.environmentObject(MenuListWealthViewModel())
.environmentObject(MenuListEducationViewModel())
.environmentObject(MenuListCareerViewModel())
.environmentObject(MenuListFamilyViewModel())
.environmentObject(MenuListHealthViewModel())
.environmentObject(MenuListSpiritualityViewModel())
}
}
WindowGroup {
// Now all are views will be in a Navigation View
NavigationView {
MakeMyOwnListView()
}
// iPad - A navigation view style represented by a view stack that only shows a single top view at a time.
.navigationViewStyle(StackNavigationViewStyle())
.environmentObject(MakeMyOwnListViewModel())
}
}
}