在swift

时间:2015-09-14 17:44:14

标签: ios swift

UILabel的文字发生变化时,有没有办法获得通知?或者我最好使用UITextField userInteractionEnabled设置为false {1}}并使用其UIControlEditingChanged事件来实现我的目的?

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

5 个答案:

答案 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)

Swift 3

首先,向UILabel添加一个观察者,以获取关键路径len(p)

text

然后

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

Swift 2

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!