UserDefaults 混淆了数据
Posted
技术标签:
【中文标题】UserDefaults 混淆了数据【英文标题】:UserDefaults is confusing the data 【发布时间】:2018-10-02 08:42:45 【问题描述】:在我的代码中,当用户进入应用程序时,我给他/她一个令牌并使用 UserDefaults 保存它,然后在应用程序的其他地方用户可以将地址设置为主地址,并通过 UserDefaults 保存它。 当我首先这样做时,它会删除我在 constantKey.token 中使用用户默认值保存的令牌,然后将“65”放入地址 constant.address 中!虽然地址不是“65”
UserDefaults.standard.set(self.Main[indexPath.row].AddressLine, forKey: constantAddress.addressLine)
////
UserDefaults.standard.set(self.Main[indexPath.row].ProvinceName, forKey: ConstantsKey.stateName)
UserDefaults.standard.set(self.Main[indexPath.row].ProvinceId, forKey: constantAddress.stateId)
UserDefaults.standard.set(self.Main[indexPath.row].CityName, forKey: constantAddress.cityName)
UserDefaults.standard.set(self.Main[indexPath.row].CityId, forKey: constantAddress.cityId)
UserDefaults.standard.set(self.Main[indexPath.row].AddressLine, forKey: constantAddress.addressLine)
UserDefaults.standard.set(self.Main[indexPath.row].PostalCode, forKey: constantAddress.postalCode)
UserDefaults.standard.set(self.Main[indexPath.row].Tel, forKey: constantAddress.telephone)
UserDefaults.standard.set(self.Main[indexPath.row].Mobile, forKey: constantAddress.mobile)
UserDefaults.standard.set(self.Main[indexPath.row].Id, forKey: constantAddress.Id)
class constantAddress
static var Id = ""
static var stateName = ""
static var stateId = "0"
static var cityName = ""
static var cityId = "0"
static var addressLine = ""
static var postalCode = ""
static var telephone = ""
static var mobile = ""
它不会将项目的值保存到 constantAddress
从 userdefualts 获取数据:
StateLbl.text = UserDefaults.standard.string(forKey: constantAddress.stateName)
CityLbl.text = UserDefaults.standard.string(forKey: constantAddress.cityName)
AddressLbl.text = UserDefaults.standard.string(forKey: constantAddress.addressLine)
PostalCodeLbl.text = UserDefaults.standard.string(forKey: constantAddress.postalCode)
TelLbl.text = UserDefaults.standard.string(forKey: constantAddress.telephone)
MobileLbl.text = UserDefaults.standard.string(forKey: constantAddress.mobile)
【问题讨论】:
您应该edit 您的问题以minimal reproducible example 的形式包含导致问题的实际代码。 是constantAddress.addressLine
== ConstantsKey.token
?您还可以提供一些您正在使用的键/值,以及您认为哪里错了吗?
当然 UserDefaults
工作正常,您的您的代码中有错误。
Swift 提示: 始终使用 lowerCamelCase
表示 Swift 变量/函数名称,例如addressLine
不是AddressLine
,main
不是Main
你仍然不明白键值映射是如何工作的,""
是键,如果你有两个代表""
的常量,它们将访问映射中的同一个对象。
【参考方案1】:
您正在使用不同的键来设置和获取来自UserDefaults
UserDefaults.standard.set(self.Main[indexPath.row].ProvinceName, forKey: ConstantsKey.stateName)
使用ConstantsKey.stateName
StateLbl.text = UserDefaults.standard.string(forKey: constantAddress.stateName)
使用constantAddress.stateName
假设ConstantsKey.stateName
有一个String值,你需要说的是……
StateLbl.text = UserDefaults.standard.string(forKey: ConstantsKey.stateName)
请仔细阅读UserDefaults
的文档……https://developer.apple.com/documentation/foundation/userdefaults
【讨论】:
而且几乎所有的constantAddress.*
都具有相同的值,因此不能用作正确的键。
我正在尝试一些东西,这就是它们不匹配的原因,我已修复它,请检查一下
这更糟。您仍然为每个键使用 空字符串,现在您也使用它来设置值 - this不会工作。使用ConstantsKey.
而不是constantAddress.
作为您的密钥以上是关于UserDefaults 混淆了数据的主要内容,如果未能解决你的问题,请参考以下文章
只有 NSDictionary 中的属性列表对象(NSNumber),但不能在 UserDefaults 中存储 dict
如何删除仅一个子项目的所有 userdefaults 数据?