当UILabel
的文字发生变化时,有没有办法获得通知?或者我最好使用UITextField
userInteractionEnabled
设置为false
{1}}并使用其UIControlEditingChanged
事件来实现我的目的?
对于前。每次我更改UILabel
的文本时,我都需要运行某些代码行。因此,不是为每种情况编写那100行几乎相似的代码,而是更改UILabel
的文本,我希望在一个地方一起编写它,并在每次UILabel
时调用它改变。我甚至不知道这是否有意义。原谅我,但我不能暴露很多代码。
答案 0 :(得分:26)
创建一个继承自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"
答案 1 :(得分:23)
首先,向UILabel添加一个观察者,以获取关键路径len(p)
。
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])
}
}
然后
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"])
}
}
答案 2 :(得分:4)
您只需使用UILabel的子类即可完成此操作:
class Label : UILabel {
override var text: String? {
didSet {
print("Text changed from \(oldValue) to \(text)")
}
}
}
oldValue
是Swift提供的特殊值。
见Property Observers
答案 3 :(得分:0)
对于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?
答案 4 :(得分:0)
快捷键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和text(新文本)是否不同,然后将触发动画
要使用:
@IBOutlet弱变量标签:ObservedLabelAnimate!