【问题标题】:How to know the sender in KVO?如何知道 KVO 中的发件人?
【发布时间】:2014-11-06 12:31:23
【问题描述】:

当我使用 KVO 时,我可以使用函数 observeValueForKeyPath(...) 的 change 参数来知道值。但是当有多个按钮添加观察者时,我怎么知道哪个按钮被改变了?

例如如下:

check1.addObserver(self, forKeyPath: "cell.state", 
    options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old,
    context: nil)
check2.addObserver(self, forKeyPath: "cell.state", 
    options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Old,
    context: nil)

override func observeValueForKeyPath(keyPath: String, ofObject: AnyObject,
    change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void> {

    if keyPath == "cell.state" {
        // I can get the value as follow, but how to know thevalue which button of?
        if change[NSKeyValueChangeNewKey]?.boolValue == true {
            self.isChecked = true
        } else {
            self.IsChecked = false
        }
   }

【问题讨论】:

    标签: ios macos cocoa swift key-value-observing


    【解决方案1】:

    ofObject: 参数是其属性已更改的对象。 在 Swift 中,您可以使用可选类型转换 (as?) 来验证对象是 适当的类型,然后将其与您的按钮进行比较:

    if let button = ofObject as? NSButton {
        if button == check1 {
            // Checkbox 1 ...
        }
    }
    

    【讨论】:

    • 谢谢!另一个问题:你为什么使用'ofObject as? NSButton'?我曾尝试使用'ofObject as? NSButton',xcode 调用了一个错误。
    • @cck:你已经用 iOS 和 OS X 标记了这个问题,所以我 猜测 check1 和 check2 是 NSButtons。也许澄清一下:这是一个 iOS 还是 OS X 项目? check1 和 check2 是如何声明的?
    • 其实是os x项目中的一个checkbox。在我的项目中是正确的,我只想知道你为什么使用'as?符号,因为我试过 'ofObject as Nsbuuton' 没用。
    • if let 是一个“可选绑定”,只能与右侧的可选表达式一起使用,例如“可选演员”as?。 – 你也可以写let button = ofObject as NSButton 而不写if。但是,如果发件人 not 是 NSButton.,它会崩溃
    • @cck:你的问题现在回答了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2012-05-28
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多