The following is a project I created to demonstrate my problem. Whenever I click and view a navigation link from the Content View and then delete it from Content View, the app crashes with the error, "Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value" on line 5 in my Child View.
My Content View:
struct ContentView: View {
@ObservedObject var ingredientViewModel = IngredientViewModel()
private func deleteIngredient(with indexSet:IndexSet) {
ingredientViewModel.ingredients.remove(atOffsets: indexSet)
}
var body: some View {
NavigationView {
List {
ForEach(ingredientViewModel.ingredients) { ingredient in
NavigationLink(destination: IngreidentView(ingredientId: ingredient.id).environmentObject(ingredientViewModel)) {
Text(ingredient.name)
}
}.onDelete(perform: deleteIngredient)
}
}
}
}
My View Model:
class IngredientViewModel: ObservableObject {
@Published
var ingredients: [Ingredient] = [Ingredient(name: "Orange", amount: 5),Ingredient(name: "Potato", amount: 3),Ingredient(name: "Tomato",amount: 1),Ingredient(name: "Salt",amount: 2)]
}
My Ingredient Model:
struct Ingredient: Identifiable {
var name: String
var amount: Int
var id = UUID().uuidString
}
My Child View in the Navigation Link
struct IngreidentView: View {
@EnvironmentObject var db: IngredientViewModel
var ingredientId: String
private var ingredient: Ingredient {
db.ingredients.filter {$0.id == ingredientId}.first!
}
var body: some View {
if(ingredient.amount == 0) {
Text("0 amount!")
} else {
Text("\(ingredient.amount) amount")
}
}
}
I used a computed property to get the ingredient in my Child View since I anticipate the ingredient will change, and I want it to be updated from the database.