在UIButton-SWIFT中实现KVO模式

时间:2015-10-30 05:01:02

标签: ios uibutton key-value-observing

我正在尝试使用KVO模式观察UIButton标题的变化。viewDidLoad中添加了观察者。

 @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方法。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的添加观察者代码不正确,它应该像

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

请注意,关键路径为"text"而不是"btntest"。 UILabel凹痕具有关键路径"btntest"

另外,请不要忘记在observeValueForKeyPath方法

中查看签名

<强>更新

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

更新2

我不建议将KVO与UI工具包元素一起使用。 KVO通常用于观察模型对象的变化。请不要误入歧途。

答案 1 :(得分:0)

对于“标题”,

UIButton不符合KVO。

除非另有说明,否则A​​pple提供的任何框架对象都不应与KVO一起使用(请参阅hereherehere)。它可能在某些情况下有效,但它是脆弱的代码。

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