从 Swift 中的“UserDefaults”更新值时出现问题

Issue in updating value from `UserDefaults` in Swift

我正在通过 UserDefaults 从 vc2 向 vc1 发送一个字符串值。但是,当我通过后退按钮从 vc2 返回到 vc1 时,该值不会更新。我在 viewWillAppear 方法中的 vc1 中获得了价值。但我的价值没有更新。我通过推送方法从 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它得到更新。那个时候我怎么更新值?

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

以下是使用 protocol 的步骤。

VC2`中执行以下步骤。

就在您的 class 声明上方声明您的委托。

protocol MyDelegate:class {
    func sendDataBack(value: Int)
}

class 声明一个 weak variabledelegate

weak var myDelegateObj: MyDelegate?

并且当您 dismiss the VC 只需使用行

调用委托时
myDelegateObj?.sendDataBack(value: yourIntegrerValue)

现在转到您的 VC1 并转到您将 VC1 推到 VC2 的那一行 并执行以下操作。

vc2.myDelegateObj = self // vc2 is VC2 objcet

并在 VC1

中实现您的委托方法
func sendDataBack(value: Int) {
     print(value)   
 }

希望对您有所帮助。

我正在尝试做与您正在做的事情类似的事情。我正在将应用程序翻译成其他语言(本地化)。所以当我在 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 时,您并不是再次加载它,而是返回到已经加载的内容。并且全局变量保持与开始时相同的值。

希望对您有所帮助。