使用绑定能力子类化 NSImageView

Subclassing NSImageView with the binding ability

我正在尝试在 NSImageView 中为图像变化设置动画。这是一个纯学术问题,我在macOS绑定框架的限制内。

请考虑型号:

class Model: NSObject {
    /// Image object for the NSImageView
    @objc dynamic var image: NSImage?
    /// The target action for button `A`.
    /// Changes the image inside model.
    /// The change is not a KVO compliment because such a change is 'inside' the model.
    @objc func a() {
        self.image = NSImage(named: "a")
    }
    /// The target action for the button B
    /// In the window UI
    @objc func b() {
        self.image = NSImage(named: "b")
    }
}

这是圣经中最简单直接的绑定示例(What Are Cocoa Bindings?)。我想实现的区别是让用户可以看到图像更改过程。

我会拦截每一个从 NSObjectController 移动到 NSImageView 的新图像,并将其与旧图像一起传输。

class AnimatedImageView: NSImageView {

    override func setValue(_ value: Any?, forKey key: String) {
        // The code execution is never through this point.
        if key == "image" {
            self.transition(value as! NSImage?)
        } else {
            super.setValue(value, forKey: key)
        }
    }

    private func transition(_ newImage:NSImage?) {
        let transition = CATransition()
        transition.duration = 1
        transition.type = .fade
        transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
        self.layer?.add(transition, forKey: nil)
        self.image = newImage
    }

}

覆盖方法 setValue(_:forKey:) 的尝试未成功。 尽管如此,我知道方法 bind(...) 运行良好,应用程序本身运行良好,动画除外。

我错过了什么?

拜托,找到附件中的项目源是there

值绑定器调用 Objective-C 方法 setObjectValue:。在 Swift 中覆盖 objectValue 属性.