在Swift

时间:2018-05-16 12:22:56

标签: ios swift userdefaults

我从vc2发送字符串值到vc1到UserDefaults。但是当我从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时,它会得到更新。我如何在那时更新价值?

2 个答案:

答案 0 :(得分:1)

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

以下是如何使用protocol

的步骤

VC2 中执行以下步骤。

在您的班级声明上方宣布您的代表。

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

class中声明weak variable

delegate
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)   
 }

希望这有帮助。

答案 1 :(得分:0)

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

希望有帮助。