Swift:Cocoa绑定到计算属性的值不起作用

Lor*_*lor 2 cocoa cocoa-bindings swift

我正在学习KVC和绑定.目前,我正在尝试将NSTextField绑定到计算属性colorWallStr.我已将滑块的值绑定到相应的颜色变量,并将标签的值绑定到计算属性.

但是,当我移动幻灯片时,标签的内容不会改变.

// Inside MainWindowController
dynamic var colorRed: CGFloat = 1.0
dynamic var colorGreen: CGFloat = 1.0
dynamic var colorBlue: CGFloat = 0.0

dynamic var colorWallStr: String {
    get {
        return "R: \(colorRed) G: \(colorGreen) B: \(colorBlue)"
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

当我将标签直接粘贴到颜色变量时,它工作正常.

在此输入图像描述

谢谢@ vadian的回答.现在我可以使用property didSet更新标签来触发更新标签方法(见下文).

dynamic var colorBlue: CGFloat = 0.0 {
    didSet {
        updateLabel()
    }
}

func updateLabel() {
    colorWall = "R: \(colorRed) G: \(colorGreen) B: \(colorBlue)"
}
Run Code Online (Sandbox Code Playgroud)

如果字符串插值中使用的属性不更新封闭的计算属性,那么为什么以下代码片段不起作用?

dynamic var colorWall: String {
    get {
        let red = colorRed
        let green = colorGreen
        let blue = colorBlue
        return "R: \(red) G: \(green) B: \(blue)"
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*son 5

Key-Value Observering API允许您通过允许注册从属密钥来处理这种情况.以下是文档介绍主题的方式:

在许多情况下,一个属性的值取决于另一个对象中的一个或多个其他属性的值.如果一个属性的值发生更改,则还应标记派生属性的值以进行更改.

在这种情况下,值colorWallString 取决于三个颜色变量的值,因此您需要做的就是实现一个明确的类方法:

// It's crucial that you get the signature of this method correct, 
// otherwise it'll just be ignored.
class func keyPathsForValuesAffectingColorWallStr() -> Set<NSObject> {
    return Set<NSObject>(arrayLiteral: "colorRed", "colorBlue", "colorGreen")
}
Run Code Online (Sandbox Code Playgroud)

如代码段中所述,用于标记依赖键的方法格式至关重要; 你可以(而且应该)在这里阅读相关文档.