Обнаружить изменение текста UILabel в быстром

Есть ли способ получить уведомление, когда есть изменение в тексте UILabel, или мне лучше использовать UITextField с userInteractionEnabled, установленным в false, и используя его событие UIControlEditingChanged для выполнения моя цель?

Например, Мне нужно запускать определенные строки кода каждый раз, когда я изменяю текст UILabel и соответственно. Поэтому вместо того, чтобы писать эти 100 строк почти одинакового кода для каждого случая, я меняю текст UILabel, я хочу записать его вместе в одном месте и вызывать его каждый раз, когда изменяется UILabel. Я даже не знаю, имеет ли это смысл. Простите меня, но я не могу разоблачить большую часть кода.

Ответ 1

Создайте класс, который наследуется от UILabel. Например:

class YourLabel: UILabel {

    override var text: String? {
        didSet {
            if let text = text {
                println("Text changed.")
            } else {
                println("Text not changed.")
            }
        }
    }
}

Создайте выход этого класса для вашего объекта.

@IBOutlet weak var label: YourLabel!
label.text = "abc"

Ответ 2

Swift 3

Сначала добавьте наблюдателя в UILabel для ключевого пути text.

label.addObserver(self, forKeyPath: "text", options: [.old, .new], context: nil)

Тогда

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  if keyPath == "text" {
    print("old:", change?[.oldKey])
    print("new:", change?[.newKey])
  }
}

Swift 2

label.addObserver(self, forKeyPath: "text", options: [.old, .new], context: nil)

Тогда

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    if keyPath == "text" {
        print("old:", change["old"])
        print("new:", change["new"])
    }
}

Консольный выход

Например, консоль будет:

old: Optional(<null>)
new: Optional(ABC)

Ответ 3

Вы можете сделать это просто с подкласса UILabel:

class Label : UILabel {
    override var text: String? {
        didSet {
            print("Text changed from \(oldValue) to \(text)")
        }
    }
}

oldValue - специальное значение, предоставляемое Swift. См. Наблюдатели свойств

Ответ 4

Для Swift 3.2 и новее предпочтительным методом является использование наблюдателя на основе замыкания:

@IBOutlet public weak var label: UILabel!

var textObserver: NSKeyValueObservation?

func someAppropriateFunction() {
  ...
  textObserver = label.observe(\.text) { [weak self] (label, observedChange) in
    self?.updateStuff()
  }
}

Закрытие передаст вам экземпляр метки и NSKeyValueObservedChange, который включает следующие свойства:

  indexes: IndexSet?
  isPrior: Bool
  kind: NSKeyValueObservedChange<Value>.Kind
  newValue: Value?
  oldValue: Value?