尝试将数据保存在 UserDefaults 中并在列表视图中显示

Trying to save data in UserDefaults and show them in list view

试图在 UserDefaults 中保存一些数据,但我在视图中得到的是 nil。 不知道哪里出了问题

这是我在 ContentView 中的代码:

var saveButton: some View {
    Button("Save Meal") {
        let meal = Meal(name: self.mealGenerator.currentMeal!.name,
                        imageUrlString: self.mealGenerator.currentMeal!.imageUrlString,
                        ingredients: self.mealGenerator.currentMeal!.ingredients,
                        instructions: self.mealGenerator.currentMeal!.instructions,
                        area: self.mealGenerator.currentMeal!.area,
                        category: self.mealGenerator.currentMeal!.category)
        self.savedMeals.meals.append(meal)
        self.savedMeals.saveMeals()
    }

这是我的 class 我正在尝试保存:

class SavedMeals: ObservableObject {
    @Published var meals: [Meal]

    func saveMeals() {
        if let encoded = try? JSONEncoder().encode(meals) {
            UserDefaults.standard.set(encoded, forKey: "Meals")
        }
     }
    
     init() {
        if let meals = UserDefaults.standard.data(forKey: "Meals") {
            if let decoded = try? JSONDecoder().decode([Meal].self, from: meals) {
                self.meals = decoded
                return
            }
        }
        self.meals = []
    }
}

我正在尝试在视图中列出:

struct SavedMealsView: View {

    @ObservedObject var savedMeals: SavedMeals

    var body: some View {
        NavigationView {
            List(savedMeals.meals) { meal in
                Text(meal.name)
            }
            .navigationBarTitle("Saved Meals", displayMode: .inline)
        }
    }
}

无论解码什么,您都在初始化结束时执行 meals = []。也许这样会更好:

init() {
    if data = UserDefaults.standard.data(forKey: "Meals") {
        do {
            meals = try JSONDecoder().decode([Meal].self, from: meals)
        } catch {
            assertionFailure("Oops!")
            meals = [] 
        }
    } else {
        meals = []
    }
}