在 UIButton-SWIFT 中实施 KVO 模式

Implement KVO pattern in UIButton-SWIFT

我正在尝试使用 viewDidLoad 中的 KVO pattern.Added 观察器观察 UIButton 标题的变化。

 @IBOutlet weak var KVOBTn: UIButton!

  override func viewDidLoad() {

    super.viewDidLoad()
    KVOBTn.titleLabel!.addObserver(self, forKeyPath: "btntest", options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old , context: nil)

  }

这是监听标题是否有变化的方法

 override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
     if keyPath == "btntest"{

      KVOBTn.backgroundColor = UIColor.greenColor()

  }

 }

我已经通过另一个按钮操作更改了按钮标题

  @IBAction func changeTitle(sender: AnyObject) {

     KVOBTn.setTitle("testAgain", forState: UIControlState.Normal)

  }

问题是 observeValueForKeyPath 方法永远不会 called.What 我做错了吗?

你添加观察者的代码不对,应该是这样的

 KVOBTn.titleLabel!.addObserver(self, forKeyPath: "text", options: [.New, .Old] , context: nil)

请注意关键路径是 "text" 而不是 "btntest"。 UI标签凹痕有一个关键路径"btntest"

另外别忘了更改 observeValueForKeyPath 方法

的签到

更新

这个forKeyPath: "text"真的很重要。这意味着您正在观察按钮标题标签的 属性 text 的变化。如果要观察标签文字颜色的变化,关键路径应该是textColor

更新 2

我不建议将 KVO 与 UI 套件元素一起使用。 KVO 通常用于观察模型的变化 objects。请不要打扰。

UIButton 不符合密钥 "title".

的 KVO

None Apple 提供的框架对象应该与 KVO 一起使用,除非另有说明(参见 here, here or here)。它可能在某些情况下有效,但它是脆弱且糟糕的代码。

您必须使用其他方式对标签更改做出反应。