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)
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)
如代码段中所述,用于标记依赖键的方法格式至关重要; 你可以(而且应该)在这里阅读相关文档.
| 归档时间: |
|
| 查看次数: |
1160 次 |
| 最近记录: |