尝试在 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 中保存数据并在列表视图中显示它们的主要内容,如果未能解决你的问题,请参考以下文章

尝试将数组保存到 UserDefaults

userdefaults 不保存按钮状态

尝试使用 NSKeyedArchiver 在 UserDefaults 中保存自定义对象

使用 UserDefaults 为不同用户存储数据

将字典保存到 UserDefaults

使用 struct id 将收藏夹保存到 UserDefaults