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 不是AddressLinemain 不是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 保存数据的正确事件是啥?

如何删除仅一个子项目的所有 userdefaults 数据?

swift--使用UserDefaults来进行本地数据存储

UserDefaults 可以在每个 .synchronize() 之后继续保存新数据吗?