Не перезаписывается переменная в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 шт):
У вас всегда срабатывает условие 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
}