Можно ли реализовать IBAction, который выполняется при изменении свойства text UILabel?

Надеюсь, это действительно просто.

Я создаю базовое приложение-калькулятор для изучения iOS и Swift и пытаюсь реализовать код для кнопки очистки.

Как правило, кнопка очистки (реализованная с помощью базового UIButton) отображает «AC», когда дисплей уже очищен (содержит только 0), и отображает «C» в противном случае.

Моя первая идея для реализации этого заключается в IBAction, который выполняется всякий раз, когда изменяется текст дисплея UILabel. Судя по всему, это не действие, уже реализованное для UILabel. Есть ли другой способ создать этот IBAction, или мне следует использовать другой подход?


person Jared    schedule 06.07.2015    source источник
comment
У вас уже есть/вероятно есть IBAction для очистки данных, измените в нем название кнопки очистки на C. Реализовать текстовое поле, которое должно изменить метод делегата UITextField, и всякий раз, когда пользователь вводит число, измените заголовок кнопки на AC.   -  person Midhun MP    schedule 06.07.2015
comment
Это то, что я сейчас делаю, однако я не считаю это лучшим решением, так как оно загромождает мой код слишком большим количеством clearButton.setTitle(...) строк в функциях, которые должны больше заботиться о выполнении других задач. Есть и другие случаи, которые я не могу уловить в функции IBAction, например, когда калькулятор оценивает выражение как равное нулю. Дисплей изменит состояние со значения на ноль, и не будет способа заставить кнопку очистки измениться.   -  person Jared    schedule 06.07.2015


Ответы (3)


Используйте KVO (ключевое значение Observing).

Генерировать уведомление всякий раз, когда любой ключ (текстовое свойство UILabel), ссылающийся на значение, изменяется.

Получите полное представление об этом здесь

person Community    schedule 06.07.2015

IBAction — это в основном упрощенный способ связывания метода с событиями элементов управления, которые вы перетаскиваете в свою раскадровку или xib. Это всего лишь один из способов (из 2 или 3) подключения вашего представления к вашему контроллеру.

Вы должны заставить все кнопки на вашем калькуляторе вызывать один и тот же метод и передавать нажатую кнопку в качестве аргумента, что-то вроде (void)buttonPressed:(id)button, затем проверить нажатую кнопку, чтобы изменить отображаемое значение, и соответственно установить кнопку (A)C.

person JackyJohnson    schedule 06.07.2015

Нашел действительно гладкое решение для моей проблемы после некоторых возни!

@IBOutlet weak var clearButton: UIButton!
@IBOutlet weak var display: UILabel! {
    didSet {
        if display.text == "0" {
            clearButton.setTitle("AC", forState: UIControlState.Normal)
        }
        else {
            clearButton.setTitle("C", forState: UIControlState.Normal)
        }
    }
}

Единственная загвоздка в том, что при нажатии кнопки очистки, когда заголовок «C», он не меняется автоматически на «AC». Это исправлено с помощью следующего IBAction для кнопки очистки:

@IBAction func clearTouchUpInside() {
    if clearButton.currentTitle == "AC" {
        calculator.clear()
    }
    display.text = "0"
    clearButton.setTitle("AC", forState: UIControlState.Normal)
}
person Jared    schedule 06.07.2015