Как я могу вернуть текст метки к исходной стоимости при отклонении контроллера предупреждений

Поэтому моя цель состоит в том, чтобы текст метки всегда возвращался к исходной цене, если контроллер представления предупреждений будет отклонен.

Вот отрывок из этой проблемы, чтобы вы, ребята, могли лучше понять это, это было бы слишком долго, чтобы объяснять по тексту...

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", style: .cancel) { (cancel) in
                self.dismiss(animated: true, 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, animated: true, completion: nil)
           }
    
 
    
}

Обе проблемы связаны с действиями dismiss как в операторе if, так и в операторе else. Я попытался добавить Decimal(sender.value) - 1 в одно действие закрытия, а затем Decimal(sender.value) + 1 в другое, но это не имело значения. То же самое происходит, когда у вас уже есть гость, и вы решаете удалить его, но в конечном итоге отклоняете предупреждение vc, цена также не возвращается. Странно то, что если я добавлю максимальное значение, равное 6, а затем снова удалю гостей до 1, цена вернется к исходной цене.

Любая помощь будет оценена, спасибо.


person dsonawave    schedule 13.03.2021    source источник
comment
Вам следует рассмотреть возможность создания пользовательского типа для хранения ваших данных (и иметь его экземпляр в качестве свойства класса) вместо того, чтобы напрямую использовать компоненты пользовательского интерфейса для хранения ваших данных.   -  person Joakim Danielson    schedule 13.03.2021
comment
Это решит проблему или вы просто рекомендуете? @Йоаким Дэниелсон   -  person dsonawave    schedule 13.03.2021
comment
Это рекомендация по дизайну, которая, я думаю, поможет вам в долгосрочной перспективе, но не решение само по себе.   -  person Joakim Danielson    schedule 13.03.2021


Ответы (2)


Вы устанавливаете только actualCostOfEvent.text перед отображением контроллера предупреждений.

В случае, если он будет отменен, вам нужно будет установить его снова с пересчитанным значением после того, как вы снова уменьшите степпер.

Я бы предложил переместить этот код во вспомогательную функцию, чтобы вы не повторяли его:

func setLabelToFormattedTotalCost(multiplier: Int) {
  let totalCost = Decimal(multiplier) * cost
  let formatted = totalCost.formattedAmount
  actualCostOfEvent.text = "$\(formatted ?? "")"
}

Затем вызовите это со значением шагового двигателя (это будет параметр multiplier) в начале guestsCount, а затем снова, как только вы уменьшите значение, если предупреждение будет отклонено.

person jnpdx    schedule 13.03.2021
comment
Итак, они оба работают, мне также пришлось добавить sampleStepperValueForIncrement = sampleStepperValueForIncrement - 1 и sampleStepperValueForIncrement = sampleStepperValueForIncrement + 1, иначе после третьего нажатия на увеличение и его отклонения добавление превратится в удаление. Хотя работает отлично, спасибо. @jnpdx - person dsonawave; 13.03.2021

Это потому, что при отклонении вы сбрасываете значение шагового двигателя и количество гостей, но не обновляете значение стоимости, поэтому в обоих действиях отклонения вы можете иметь

        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", style: .cancel) { (cancel) in
                self.dismiss(animated: true, completion: nil)
                self.guestNumberCount.text = String(Int(sender.value) + 1)
                self.stepperValue.value += 1

                self.updateCostValue()
            }
person Sandeep Bhandari    schedule 13.03.2021
comment
Это тоже работает, спасибо. @Сандип Бхандари - person dsonawave; 13.03.2021
comment
@dsonawave: рад, что смог помочь :) - person Sandeep Bhandari; 13.03.2021