[英]Detect UILabel text change in swift
有沒有辦法在UILabel
的文本發生更改時獲得通知,或者我最好使用UITextField
並將userInteractionEnabled
設置為false
並使用其UIControlEditingChanged
事件來實現我的目的?
例如。 每次更改UILabel
的文本時,我都需要運行某些代碼行。 因此,與其為每次更改UILabel
的文本都編寫這 100 行幾乎相似的代碼, UILabel
將它寫在一個地方,並在每次更改UILabel
時調用它。 我什至不知道這是否有意義。 原諒我,但我不能公開大部分代碼。
創建一個繼承自 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"
首先,為鍵路徑text
添加一個觀察者到 UILabel 。
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])
}
}
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)
你可以簡單地使用 UILabel 的子類來做到這一點:
class Label : UILabel {
override var text: String? {
didSet {
print("Text changed from \(oldValue) to \(text)")
}
}
}
oldValue
是 Swift 提供的一個特殊值。 見物業觀察員
對於 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?
斯威夫特 5
如果要觀察標簽中的文本變化並制作動畫。 您需要創建子類 UILabel
class ObservedLabelAnimate: SpringLabel {
override var text: String? {
didSet {
if let text = text {
if oldValue != text {
animation = "fadeInLeft"
duration = 1.2
animate()
}
print("This is oldvalue \(oldValue), and this is the new one \(text)")
}
}
}
}
對於此示例,我將繼承自 UILabel 的“SpringLabel”子類化
來自https://github.com/MengTo/Spring
基本上它會檢查 oldValue 和文本(新的)是否不同,然后動畫將被觸發
使用:
@IBOutlet 弱變量標簽:ObservedLabelAnimate!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.