问题描述
所以我的目标是如果警报视图控制器被解除,标签文本总是恢复到原始价格。
这是问题的剪辑,以便你们可以更深入地了解它,文字解释太长了...
如您所见,当用户取消警报提示时,我希望一切都恢复原状,就好像他们从未按下过它一样。步进值恢复,数字标签文本 恢复,但事件成本没有,我不知道为什么。
这是我与步进器一起使用的 @IBAction
函数:
@IBAction func guestsCount(_ sender: UIStepper) {
guestNumberCount.text = String(Int(sender.value))
let totalCost = Decimal(sender.value) * cost
let formatted = totalCost.formattedamount
var textfield = UITextField()
var textfield2 = UITextField()
actualCostOfEvent.text = "$\(formatted ?? "")"
if(Int(sender.value) > sampleStepperValueForIncrement){
print("increasing")
sampleStepperValueForIncrement += 1
let alert = UIAlertController(title: "Add A Guest",message: "Type full name the of guest you want to add below",preferredStyle: .alert)
let addGuest = UIAlertAction(title: "Add",style: .default) { (add) in
guard let user = Auth.auth().currentUser else { return }
db.document("student_users/\(user.uid)/guestTickets/guestDetails").setData(["guests": FieldValue.arrayUnion([textfield.text ?? "Nil"])],merge: true) { (error) in
if let error = error {
print("There was an error adding the name: \(error)")
} else {
print("name added successfully")
}
}
}
let dismiss = UIAlertAction(title: "dismiss",style: .cancel) { (cancel) in
self.dismiss(animated: true,completion: nil)
self.guestNumberCount.text = String(Int(sender.value) - 1)
self.stepperValue.value -= 1
}
alert.addTextField { (alerttextfield) in
textfield = alerttextfield
alerttextfield.placeholder = "Guest Name"
alerttextfield.clearButtonMode = .whileEditing
}
alert.addAction(dismiss)
alert.addAction(addGuest)
present(alert,animated: true,completion: nil)
}
else {
print("decreasing")
sampleStepperValueForIncrement = sampleStepperValueForIncrement - 1
let alert = UIAlertController(title: "Remove A Guest",message: "Type the full name of the guest you want to remove. The guest name is case-sensitive and must equal the name you added.",preferredStyle: .alert)
let dismiss = UIAlertAction(title: "dismiss",completion: nil)
self.guestNumberCount.text = String(Int(sender.value) + 1)
self.stepperValue.value += 1
}
let removeGuest = UIAlertAction(title: "Remove",style: .destructive) { (remove) in
guard let user = Auth.auth().currentUser else { return }
db.document("student_users/\(user.uid)/guestTickets/guestDetails").updateData(["guests": FieldValue.arrayRemove([textfield2.text ?? "Nil"])]) { (error) in
if let error = error {
print("There was an error removing the name: \(error)")
} else {
print("name removed successfully")
}
}
}
alert.addTextField { (alerttextfield2) in
textfield2 = alerttextfield2
alerttextfield2.placeholder = "Guest Name"
alerttextfield2.clearButtonMode = .whileEditing
}
alert.addAction(dismiss)
alert.addAction(removeGuest)
present(alert,completion: nil)
}
}
问题都源于 dismiss
语句和 if
语句中的 else
操作。我尝试在一个关闭操作中添加 Decimal(sender.value) - 1
,然后在另一个中添加 Decimal(sender.value) + 1
,但这些都没有区别。当您已经添加了一个客人并决定删除时,确切的事情发生了,但最终解除了警报 vc,价格也不会恢复。奇怪的是,如果我一直添加到最大值,即 6,然后将客人一直删除到 1,价格将恢复到原始价格。
任何帮助将不胜感激,谢谢。
解决方法
您只能在显示警报控制器之前设置 actualCostOfEvent.text
。
如果它被取消,您需要再次设置它,并在您再次减少步进器后重新计算值。
我建议将该代码移至辅助函数中,以免重复:
func setLabelToFormattedTotalCost(multiplier: Int) {
let totalCost = Decimal(multiplier) * cost
let formatted = totalCost.formattedAmount
actualCostOfEvent.text = "$\(formatted ?? "")"
}
然后,在 multiplier
的开头使用步进值(即 guestsCount
参数)调用它,如果警报解除,则在您减小该值后再次调用它。
这是因为在关闭时您会重置步进值和客人数量但不更新成本值,因此在这两个关闭操作中您都可以拥有
let dismiss = UIAlertAction(title: "Dismiss",style: .cancel) { (cancel) in
//all other code of yours and finally
let totalCost = Decimal(self.stepperValue.value) * cost
let formatted = totalCost.formattedAmount
actualCostOfEvent.text = "$\(formatted ?? "")"
}
您显然可以将其移动到一个函数并从两个解除操作中调用该函数
func updateCostValue() {
let totalCost = Decimal(self.stepperValue.value) * cost
let formatted = totalCost.formattedAmount
actualCostOfEvent.text = "$\(formatted ?? "")"
}
let dismiss = UIAlertAction(title: "Dismiss",style: .cancel) { (cancel) in
self.dismiss(animated: true,completion: nil)
self.guestNumberCount.text = String(Int(sender.value) - 1)
self.stepperValue.value -= 1
self.updateCostValue()
}
let dismiss = UIAlertAction(title: "Dismiss",completion: nil)
self.guestNumberCount.text = String(Int(sender.value) + 1)
self.stepperValue.value += 1
self.updateCostValue()
}