我从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时,它会得到更新。我如何在那时更新价值?
答案 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时,您不会再次加载它,而是回到已经加载的内容。并且全局变量的值与开头相同。
希望有帮助。