从 Swift 中的“UserDefaults”更新值的问题
Posted
技术标签:
【中文标题】从 Swift 中的“UserDefaults”更新值的问题【英文标题】:Issue in updating value from `UserDefaults` in Swift 【发布时间】:2018-05-16 12:22:55 【问题描述】:我正在通过UserDefaults
将字符串值从我的 vc2 发送到 vc1。但是,当我通过后退按钮从 vc2 移回 vc1 时,该值不会更新。我在viewWillAppear
方法中获得了vc1 的价值。但我的价值没有更新。我通过 push 方法从 vc1 导航到 vc2。
这就是我在 vc2 中存储用户默认值的方式,
cartItems = cartItems + 1
print(cartItems)
let badgeCount = String(cartItems)
print(badgeCount)
let rightBarButton = self.navigationItem.rightBarButtonItem
let badge = String(badgeCount)
rightBarButton?.addBadge(text: badge)
UserDefaults.standard.set(badgeCount, forKey: "cartsItems")
UserDefaults.standard.synchronize()
在 vc1 中,我在 viewWillAppear 委托中得到这样的结果,
let count = UserDefaults.standard.string(forKey: "cartsItems")
print(count)
当我通过后退按钮从 vc2 回到 vc1 时,值永远不会更新,当我调用其他一些 vc 并且再次调用 vc1 时,它会得到更新。那时我如何更新价值?
【问题讨论】:
添加一些额外的代码badgeCount
是什么类型?是否有可能您正在设置一个整数但试图检索一个字符串?
我已编辑,请检查。 @Anbu.karthik
UserDefaults
不适合在控制器之间共享数据。使用回调、协议/委托或通知。
这么多 vc2
和 vc1
让我感到困惑。能否请您告诉您在哪里设置值以及在哪里没有得到?
【参考方案1】:
好吧,正确的做法是使用简单的委托协议将数据从一个VC2
传输到另一个VC1
。
以下是如何使用protocol
的步骤。
在VC2
` 执行以下步骤。
在你的类声明上方声明你的委托。
protocol MyDelegate:class
func sendDataBack(value: Int)
在class
中声明您的delegate
的weak variable
weak var myDelegateObj: MyDelegate?
当你 dismiss the VC
时,只需使用 line 调用代表
myDelegateObj?.sendDataBack(value: yourIntegrerValue)
现在转到您的VC1
并转到您将VC1
推送到VC2
的行
并执行以下操作。
vc2.myDelegateObj = self // vc2 is VC2 objcet
并在VC1
中实现你的委托方法
func sendDataBack(value: Int)
print(value)
希望这会有所帮助。
【讨论】:
让我试试。 @Roshan Singh Bisht 如果有任何困惑,请告诉我! 我应该在 vc1 哪里声明这个? vc2.myDelegateObj = 自我。 @Roshan Singh Bisht 声明您在 vc1 中获取 vc2 对象的位置或您尝试从 vc1 推送到 vc2 的位置 我已经在那里声明了,但是在我在推送视图控制器上声明的那一点上它崩溃了。 @Roshan Singh Bisht【参考方案2】:我正在尝试做一些类似于你正在做的事情。我正在将应用程序翻译成其他语言(本地化)。因此,当我在 VC2 上选择一种语言时,我会返回 VC1,VC1 中的字符串应根据所选语言进行更新。
语言存储在 Userdefaults() 中。
我想我知道你为什么会遇到这个问题。要了解正在发生的事情,请尝试在 VC1 中编写:
let count = UserDefaults.standard.string(forKey: "cartsItems") // I suppose this is a global variable.
override func viewWillAppear(_ animated: Bool)
print("This is the value of the global variable: \(count)")
print("This is the value of Userdefaults directly: \(UserDefaults.standard.string(forKey: "cartsItems"))")
您会期望两个结果相同。但是,来自全局变量的第一个不会更新;而第二个,直接使用 Userdefaults,被更新了。
我想这是因为当您加载 VC1 时,视图被加载并且变量得到它们的值。打开 VC2 时,它在 VC1 上方打开。当您返回 VC1 时,您不会再次加载它,而是返回已加载的内容。并且全局变量保持与开始时相同的值。
希望对您有所帮助。
【讨论】:
以上是关于从 Swift 中的“UserDefaults”更新值的问题的主要内容,如果未能解决你的问题,请参考以下文章
确定可以存储在 UserDefaults 中的 Swift 类型
Swift Userdefaults 将 String 转换为 __NSCFString