swift - 使用用户默认值存储从另一个视图控制器传递的数据
问题描述
我正在使用用户默认值存储一个整数,但我尝试存储的数字是通过 segue (ageFromSettings) 传输的,并且需要有一个默认值。
问题是通过 segue 传输的数据在呈现时会被存储,但是当应用程序重新启动时它会存储默认值。
任何想法如何保存通过 segue 传递的项目?
class ViewController: UIViewController {
@IBOutlet weak var youHaveLabel: UILabel!
@IBOutlet weak var daysLeftLabel: UILabel!
@IBOutlet weak var leftToLiveLabel: UILabel!
@IBAction func settingsButtonPressed(_ sender: Any) {
performSegue(withIdentifier: "toSettings", sender: nil)
}
var daysLeft = 0
var ageFromSettings = 36500
override func viewDidAppear(_ animated: Bool) {
UserDefaults.standard.set(ageFromSettings, forKey: "persistedAge")
if let age = UserDefaults.standard.object(forKey: "persistedAge") as? Int{
print("age: \(age)")
daysLeft = age
}
if daysLeft == 36500 {
daysLeftLabel.alpha = 0
youHaveLabel.alpha = 0
leftToLiveLabel.text = "Set your age in Settings"
} else if daysLeft == -1{
leftToLiveLabel.text = "Day On Borrowed Time"
} else if daysLeft == 0{
leftToLiveLabel.text = "Statistically, you died today"
} else if daysLeft == 1{
leftToLiveLabel.text = "Day Left to Live"
} else if daysLeft < 0 {
leftToLiveLabel.text = "Days on Borrowed Time"
}
if daysLeft > -1 {
daysLeftLabel.text = String(daysLeft)
} else {
daysLeftLabel.text = String(daysLeft * -1)
}
}
}
解决方案
问题是你在说:
UserDefaults.standard.set(ageFromSettings, forKey: "persistedAge")
if let age = UserDefaults.standard.object(forKey: "persistedAge") as? Int{
这太疯狂了。在第二行中,我们知道UserDefaults 包含一个persistedAge
键,并且我们知道它的值是什么——因为你只是把它放在那里,在第一行。即使您已经persistedAge
在应用程序的先前运行中设置了不同的值,您也会这样做。
删除第一行。如果您的目标是提供初始默认值,请使用register(defaults:_)
. 这就是它的用途。只有在您还没有打电话的情况下才会使用它set(_:forKey:)
。
推荐阅读
- python - 如何在 Python 中将数组转换为矩阵
- c++ - 在宏中加入前 n-1 个参数
- python - Python将类移动到分隔文件导致nameError
- python - 无法在 keras 中训练模型
- jboss6.x - Jboss工具配置
- entity-framework-core - 获取没有表之间关系的相关数据
- amazon-web-services - 使用 new DocumentClient() 的正确方法
- regex - 最后引号之间的字符串的正则表达式?
- sql - Azure SQL DB 导致存储过程的连接超时
- c# - 有没有办法在 C# MVC 中创建自定义路由?