我有一个文本字段,可以在其中输入双精度字,它将显示在第二个视图控制器中的标签上。该值将使用UserDefaults保存。我正在努力寻找解决方法,以便能够使用此保存的值并使用在文本字段中输入的新值来增加它。 即第一次输入5;标签显示5。第二次输入3。标签显示8。
我尝试使用下面的if函数,但这没有用。当我第二次输入值时,标签值又回到0,如果再输入一个值,则标签将使用输入的值进行更新。
func saveOne() {
UserDefaults.standard.set(weekOneTotal, forKey: "WEEKONE")
secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
}
func addCorrectSpend () {
guard let addAmount = convertAmount(input: enterField.text!) else {
print("Invalid amount")
return
}
if UserDefaults().double(forKey: "WEEKONE") == 0 {
weekOneTotal += addAmount
secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
saveOne()
}
else if UserDefaults().double(forKey: "WEEKONE") > 0 {
let defaultOne = UserDefaults.standard
defaultOne.set(defaultOne.double(forKey: "WEEKONE")+addAmount, forKey: "WEEKONE")
secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
saveOne()
}
}
答案 0 :(得分:0)
(快速)回答为什么发生这种情况:您正在UserDetails.standard
中设置初始值,这是正确的,但是随后您每次都在新的UserDefaults()
对象中更新该值。< / p>
由于其中包含一些不必要的内容,因此您也可以减少一些代码。最终,您只需要将新值添加到现有值即可,因此您实际上并不需要检查现有值是否==0。这是我如何重构以上代码的示例:
func addCorrectSpend() {
guard let addAmount = convertAmount(input: enterField.text!) else {
print("Invalid amount")
return
}
//Get the existing total (will be 0 if none)
let weekOneAmount = UserDefaults.standard.double(forKey: "WEEKONE")
//Add the existing total to the new amount from your textField
let weekOneTotal = weekOneAmount + addAmount
//Update UserDefaults.standard to the new value
UserDefaults.standard.set(weekOneTotal, forKey: "WEEKONE")
//Set the text
secondScreen.weekOneText = "\(weekOneTotal)"
}
答案 1 :(得分:0)
有一个不同的方法将吸气和二传手利用定制的weekOneAmount
,这样就可以抽象掉你的电话,并作为一个正常的变量,它的大部分工作。
var weekOneAmount: Double {
get {
return UserDefaults.standard.double(forKey: "WEEKONE")
}
set {
UserDefaults.standard.set(newValue, forKey: "WEEKONE")
}
}
现在,无论何时需要读取或写入,它的行为都与其他任何变量一样。