解除警报控制器后,如何将标签文本恢复为原始成本

问题描述

所以我的目标是如果警报视图控制器被解除,标签文本总是恢复到原始价格。

这是问题的剪辑,以便你们可以更深入地了解它,文字解释太长了...

Bug gif

如您所见,当用户取消警报提示时,我希望一切都恢复原状,就好像他们从未按下过它一样。步进值恢复,数字标签文本 恢复,但事件成本没有,我不知道为什么。

这是我与步进器一起使用的 @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()
            }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...