从 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 不适合在控制器之间共享数据。使用回调、协议/委托或通知。 这么多 vc2vc1 让我感到困惑。能否请您告诉您在哪里设置值以及在哪里没有得到? 【参考方案1】:

好吧,正确的做法是使用简单的委托协议将数据从一个VC2 传输到另一个VC1

以下是如何使用protocol 的步骤。

VC2 ` 执行以下步骤。

在你的类声明上方声明你的委托。

protocol MyDelegate:class 
    func sendDataBack(value: Int)

class 中声明您的delegateweak 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

确定可以存储在 UserDefaults 中的 Swift 类型

swift 删除UserDefaults中的所有先前键值对

Swift Userdefaults 将 String 转换为 __NSCFString

您是不是能够跨不同的视图控制器/.swift 文件检索存储在 UserDefaults 中的数据?

在 Swift 中清除 UserDefaults 的一个子集 [关闭]