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