Не перезаписывается переменная вo ViewController

Подскажите, пожалуйста. Во ViewController'e есть 3 кнопки и @IBAction'ы к ним. Кнопкам присвоил теги.

Первая кнопка:

    @IBAction func fewButtonPressed(_ sender: UIButton) {
    fewButtonOutlet.alpha = 0.5
    mediumButtonOutlet.alpha = 1.0
    manyButtonOutlet.alpha = 1.0
    nextButtonOutlet.isUserInteractionEnabled = true
    nextButtonOutlet.alpha = 1.0

    if sender.tag == 1 {
        activityFew = calcWater.calculateWaterForMan(weight: weightMan ?? 0)
    }
  }

Вторая кнопка:

   @IBAction func mediumButtonPressed(_ sender: UIButton) {
    mediumButtonOutlet.alpha = 0.5
    fewButtonOutlet.alpha = 1.0
    manyButtonOutlet.alpha = 1.0
    nextButtonOutlet.isUserInteractionEnabled = true
    nextButtonOutlet.alpha = 1.0

    if sender.tag == 2 {
        activityMedium = calcWater.calculateMediumActivity(weight: weightMan ?? 0)
        activityMedium *= 1000
    }
  }

Третья кнопка:

    @IBAction func manyButtonPressed(_ sender: UIButton) {
    manyButtonOutlet.alpha = 0.5
    fewButtonOutlet.alpha = 1.0
    mediumButtonOutlet.alpha = 1.0
    nextButtonOutlet.isUserInteractionEnabled = true
    nextButtonOutlet.alpha = 1.0

    if sender.tag == 3 {
        activityHard = calcWater.calculateHardActivity(weight: weightMan ?? 0)
        activityHard *= 1000
    }
  }

Есть 3 переменные, которые я хочу передать в следующий ViewController и там в зависимости от нажатой кнопки выше, в Label записывался результат.

Я написал такую функцию:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == K.resultSegueMan {
        let destinationVC = segue.destination as! ResultViewController


        if fewButtonOutlet.tag == 1 {
            destinationVC.activityFewResult = activityFew
            destinationVC.resultString = String(activityFew)
        } else if mediumButtonOutlet.tag == 2 {
            destinationVC.activityMediumResult = activityMedium
            destinationVC.resultString = String(activityMedium)
        } else if manyButtonOutlet.tag == 3 {
            destinationVC.activityHardResult = activityHard
            destinationVC.resultString = String(format: "%.1f", activityHard)
        } else {
            return
        }
    }
}

Но почему-то при запуске приложения происходит следующее: При нажатии на первую кнопку результат записывается в Label на следующем ViewController, а при нажатии на остальные две кнопки, на следующем View результат в Лейбле = 0.0. Переменные со следующего ViewController:

var activityFewResult = 0.0
var activityMediumResult = 0.0
var activityHardResult = 0.0
var resultString = ""

То есть переменная activityFewResult перезаписывается, а остальные выводят в Label 0.0

В чем проблема? Подскажите, пожалуйста.


Ответы (1 шт):

Автор решения: schmidt9

У вас всегда срабатывает условие if fewButtonOutlet.tag == 1, поэтому и результат всегда только для первой кнопки

Можно сделать так - завести переменную, сохраняющую тег текущей кнопки и затем использовать уже его

var selectedButtonTag: Int = 0

В обработчиках нажатий кнопок присваивать его

@IBAction func fewButtonPressed(_ sender: UIButton) {
    // ...
    selectedButtonTag = sender.tag
}

и затем использовать

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == K.resultSegueMan {
        let destinationVC = segue.destination as! ResultViewController

        switch selectedButtonTag {

        case 1:
            destinationVC.activityFewResult = activityFew
            destinationVC.resultString = String(activityFew)

        case 2:
            destinationVC.activityMediumResult = activityMedium
            destinationVC.resultString = String(activityMedium)

        case 3:
            destinationVC.activityHardResult = activityHard
            destinationVC.resultString = String(format: "%.1f", activityHard)

        default:
            break

        }

    }
}

Другой вариант - обойтись без тегов и использовать параметр sender, так как он в данном случае как раз будет являться кнопкой, на которую вы нажали

    switch sender as? UIButton {

    case fewButtonOutlet:
        destinationVC.activityFewResult = activityFew
        destinationVC.resultString = String(activityFew)

    // другие кнопки ...

    default:
        break

    }
→ Ссылка