Обнаружить изменение текста 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?