在Swift/iOS应用中保存数据



我正试图修复我的代码来保存数据,以便由用户输入的膳食保存为当他们关闭应用程序并重新打开它。我在addMeal函数中添加了一个打印语句来调试,它在第一次打开应用程序时起作用,但是当应用程序关闭并重新打开时,打印语句没有达到(即使膳食仍在添加,因为当我使用膳食生成膳食计划时,重新打开后添加的膳食显示在膳食计划上??)。

我已经尝试使用UserDefaults来保存用户输入的膳食,并在应用程序关闭和重新打开时加载它们。这些餐点用于生成膳食计划。用户输入并添加的任何食物都应该被应用程序记住,以备将来使用。

var meals: [String] = []
var mealIngredients: [String] = []
override func viewDidLoad() {
super.viewDidLoad()

if let stateDictionary = UserDefaults.standard.dictionary(forKey: "savedState") {
// Restore any properties you want to restore
meals = stateDictionary["meals"] as? [String] ?? []
mealIngredients = stateDictionary["mealIngredients"] as? [String] ?? []
}
}
@IBAction func addMeal(_ sender: Any) {
if let mealName = mealNameField.text, let mealIngredients = mealIngredientsField.text {
if mealName != "" && mealIngredients != "" {
meals.append(mealName)
print("Added")
self.mealIngredients.append(mealIngredients)
mealNameField.text = ""
mealIngredientsField.text = ""

UserDefaults.standard.set(meals, forKey: "meals")
UserDefaults.standard.set(mealIngredients, forKey: "mealIngredients")
}
}
}

加载字典一个但是你保存两个。因此,加载数据总是可靠地失败。

将两个数组放入字典中并保存

@IBAction func addMeal(_ sender: Any) {
if let mealName = mealNameField.text, !mealName.isEmpty,
let mealIngredients = mealIngredientsField.text, !mealIngredients.isEmpty {

meals.append(mealName)
print("Added")
self.mealIngredients.append(mealIngredients)
mealNameField.text = ""
mealIngredientsField.text = ""
let stateDictionary = ["meals":meals, "mealIngredients":mealIngredients]  
UserDefaults.standard.set(stateDictionary, forKey: "savedState")
}
}

您正在尝试获取密钥UserDefaults.standard.dictionary(forKey: "savedState")的值。

但是你只写了两个数组:

UserDefaults.standard.set(meals, forKey: "meals")
UserDefaults.standard.set(mealIngredients, forKey: "mealIngredients")

savedState

没有值也可以用mealName.isEmpty()代替mealName == ""