【问题标题】:Implement KVO pattern in UIButton-SWIFT在 UIButton-SWIFT 中实现 KVO 模式
【发布时间】:2015-10-30 05:01:01
【问题描述】:

我正在尝试使用 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 方法。我做错了什么?

【问题讨论】:

  • 如果你能多解释一下KVOBTn会更好。
  • KVOBTn 只是一个出口......

标签: ios uibutton key-value-observing


【解决方案1】:

您的添加观察者代码不正确,应该是这样的

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

请注意,密钥路径是 "text" 而不是 "btntest"。 UILabel 凹痕有一个关键路径"btntest"

另外不要忘记在observeValueForKeyPath方法中进行检查

更新

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

更新 2

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

【讨论】:

  • 是的,这是错误,但为什么关键路径文本真的很重要??
  • UIButton 对于键“title”不符合 KVO。
  • 在他询问的问题中,他正在为 UIButton.titleLabel 而不是 UIButton 添加观察者到关键路径标题
  • @Johnykutty 是的,但您的回答只是表面上解决了问题。在不符合 KVO 的属性上使用 KVO 仍然是一个不好的建议。
  • 我同意,但我不建议或推荐将 KVO 用于 UI 元素。只是指出他的代码的问题。
【解决方案2】:

UIButton 对于键“title”不符合 KVO。

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

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

【讨论】:

  • 那是为了测试目的,如果在我观察按钮标题时将密钥路径更改为“文本”后它工作正常......
  • @swiftBUTCHER 如果像这样使用 KVO 进行调试,没有什么坏处。只需确保在投入生产之前删除代码即可。
  • 好的..那只是为了自学从未使用过 KVO :)..但是你能告诉我什么时候使用这些 NSKeyValueObservingOptions.New 或 Old
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多