在 Swift 中从"用户默认值"更新值时出现问题



我正在通过UserDefaults将字符串值从我的 vc2 发送到 vc1。但是当我通过后退按钮从 vc1 移回 vc2 时,该值不会更新。我在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 中,我在视图中得到这样的视图将出现代表,

let count =  UserDefaults.standard.string(forKey: "cartsItems")
print(count)

当我通过后退按钮值从 vc1 返回到 vc2 时永远不会更新,当我调用其他 vc 而不是再次调用 vc1 时,它会得到更新。我当时如何更新值?

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

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

VC2中,请执行以下步骤。

在您的类声明的正上方声明您的委托。

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

class声明您的delegateweak variable

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

您会期望两个结果相同。但是,来自全局变量的第一个将不会更新;而第二个,直接使用用户默认值,被更新。

我想这是因为当您加载 VC1 时,会加载视图并且变量会获取其值。当您打开 VC2 时,它会在 VC1 上方打开。当您返回到 VC1 时,您不会再次加载它,而是返回到已加载的内容。全局变量保持与开始时相同的值。

希望有帮助。

最新更新