尝试在 UserDefaults 中保存数据并在列表视图中显示它们
Posted
技术标签:
【中文标题】尝试在 UserDefaults 中保存数据并在列表视图中显示它们【英文标题】:Trying to save data in UserDefaults and show them in list view 【发布时间】:2021-10-24 20:49:42 【问题描述】:试图在 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 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)
【问题讨论】:
欢迎来到 SO - 请使用 tour 并阅读 How to Ask 以改进、编辑和格式化您的问题。如果没有Minimal Reproducible Example,就无法帮助您进行故障排除。 你try?
ing 太多了。捕获并处理可能的错误。
看看this这可能会有所帮助
为什么你的初始化末尾有self.meals = []
?那应该在一个 else 中,否则你总是会得到一个空数组。
【参考方案1】:
无论您解码什么,您都在初始化结束时执行meals = []
。也许这会更好:
init()
if data = UserDefaults.standard.data(forKey: "Meals")
do
meals = try JSONDecoder().decode([Meal].self, from: meals)
catch
assertionFailure("Oops!")
meals = []
else
meals = []
【讨论】:
以上是关于尝试在 UserDefaults 中保存数据并在列表视图中显示它们的主要内容,如果未能解决你的问题,请参考以下文章