簡體   English   中英

快速檢測 UILabel 文本更改

[英]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"

斯威夫特 3

首先,為鍵路徑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])
  }
}

斯威夫特 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)

你可以簡單地使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM