Не обновляется label.text


#1

Не могу понять в чем дело - если indicatorUnitPressed = 0, то при нажатии кнопки, текст меняется без проблем, но если indicatorUnitPressed равен числу от 1 до 7 то, при первом нажатии кнопки, текст не меняется, а при втором меняется.

var indicatorUnitPressed = 0 // Меняется от 0 до 7 в зависимости от того какую кнопку нажали
var switchPressed = 0 // по умолчанию

@IBAction func switchButtonPressed(_ sender: UIButton)
    {
        if switchPressed != 1
        {
            switch indicatorUnitPressed
            {
            case 0:
                infoLabel.text = "Fº to Cº"
                print("\(indicatorUnitPressed)")
            case 1:
                infoLabel.text = "Km to Ml"
                print("\(indicatorUnitPressed)")
            case 2:
                infoLabel.text = "cm to in"
                print("\(indicatorUnitPressed)")
            case 3:
                infoLabel.text = "cm to ft"
            case 4:
                infoLabel.text = "m2 to sq.ft"
            case 5:
                infoLabel.text = "Litr to Gal"
            case 6:
                infoLabel.text = "Litr to Oz"
            case 7:
                infoLabel.text = "Kg to Pound"
            default:
                break
            }
            switchPressed = 1
        }
        else
        {
            print("\(switchPressed)")
            switch indicatorUnitPressed
            {
            case 0:
                infoLabel.text = "Cº to Fº"
                print("\(indicatorUnitPressed)")
            case 1:
                infoLabel.text = "Ml to Km"
                print("\(indicatorUnitPressed)")
            case 2:
                infoLabel.text = "in to cm"
            case 3:
                infoLabel.text = "ft to cm"
            case 4:
                infoLabel.text = "sq.ft to m2"
            case 5:
                infoLabel.text = "Gal to Litr"
            case 6:
                infoLabel.text = "Oz to Litr"
            case 7:
                infoLabel.text = "Pound to Kg"
            default:
                break
            }
            switchPressed = 0
        }
    }

Полный файл тут https://www.dropbox.com/s/fxa8ly6j5lxvpuq/MilesViewController.swift?dl=0


#2

Форматируйте код при добавлении сюда. Ничего не понятно. И не вешайте столько всего в кнопку,а сделайте функциями


#3

Сейчас поправил, спасибо


#4

Если честно, то немного запутался в вашем коде и не до конца понимаю принцип работы, но вот что заметил:

func tempButtonPressed() {
.....
infoLabelText.text = "C to F"
}
func mlButtonPressed() {
.....
infoLabelText.text = "Km to Ml"
}

А в функции switchButtonPressed идёт так:

switch indicatorUnitPressed  {
        case 0:
            infoLabel.text = "Fº to Cº"
        case 1:
            infoLabel.text = "Km to Ml"

Видите? Видимо, при переходе в раздел вы настраиваете switchPressed на false и задаёте стандартный текст. Свитчер же берет false и повторяет стандартный текст для всех, кроме 0.

Использование тернарного опертого позволило бы сократить только эту часть кода в два раза:

infoLabel.text = switchPressed ? "Fº to Cº" : "Cº to Fº"

#5

Спасибо за ответ.

Если честно не совсем понял в чем проблема ? Почему он при первом нажатии повторяет текст для всего кроме 0. При этом меняя значение switchPressed.


#6

Спасибо. Понял свою ошибку, дурак невнимательный я.


#7

Не используй цифры в switch. Непонятно что ты под цифрами понимаешь. Сделай enum-ы, которые легко потом будет править и отслеживать изменения.
И в самом методе код сократиться. Вот например так.

    enum ConvertType: Int, CaseIterable {
	case fahrenheitAndCelsius, kilometerAndMiles
	
	var forwardText: String {
		switch self {
		case .fahrenheitAndCelsius:
			return "Fº to Cº"
		case .kilometerAndMiles:
			return "Km to Ml"
		}
	}
	
	var reverseText: String {
		switch self {
		case .fahrenheitAndCelsius:
			return "Cº to Fº"
		case .kilometerAndMiles:
			return "Ml to Km"
		}
	}
}

enum SwitchType: Int {
	case on, off
}

var switchPressed: Int = 0
var indicatorUnitPressed: Int = 0

func switchButtonPressed() {
	
	guard let switchType = SwitchType(rawValue: switchPressed),
		let convertType = ConvertType(rawValue: indicatorUnitPressed) else {
			fatalError()
	}
	
	switch switchType {
	case .on:
		print(convertType.forwardText)
		switchPressed = 1
	case .off:
		print(convertType.reverseText)
		switchPressed = 0
	}
}