Възможно ли е да се приложи IBAction, което се изпълнява, когато текстовото свойство на 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 (наблюдение на ключова стойност).

Генерирайте известие всеки път, когато стойността на референтната стойност на ключ (свойството на текст на 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