在swift中检测UILabel文本更改

gen*_*aks 17 ios swift

有没有办法在UILabel文本发生变化时收到通知,或者我最好使用UITextFieldwith userInteractionEnabledset false并使用其UIControlEditingChanged事件来实现我的目的?

对于前者 每次我更改UILabel文本时都需要运行某些代码行.因此,不是为每种情况编写那100行几乎相似的代码,而是更改UILabel文本,我希望在一个地方一起编写它,并在每次UILabel更改时调用它.我甚至不知道这是否有意义.原谅我,但我不能暴露很多代码.

rid*_*cuk 26

创建一个继承自UILabel的类.如:

class YourLabel: UILabel {

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

为您的对象创建此类的出口.

@IBOutlet weak var label: YourLabel!
label.text = "abc"
Run Code Online (Sandbox Code Playgroud)


dev*_*oul 24

斯威夫特3

首先,将一个观察者添加到UILabel以获取关键路径text.

label.addObserver(self, forKeyPath: "text", options: [.old, .new], context: nil)
Run Code Online (Sandbox Code Playgroud)

然后

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])
  }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

label.addObserver(self, forKeyPath: "text", options: [.Old, .New], context: nil)
Run Code Online (Sandbox Code Playgroud)

然后

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"])
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出

例如控制台将是:

old: Optional(<null>)
new: Optional(ABC)
Run Code Online (Sandbox Code Playgroud)

  • 这确实有效.我已将它用于其他答案,因为可以从使用标签的同一个类中调用函数. (2认同)