Cocoa绑定和KVC与CGColorRef

时间:2009-08-08 17:16:34

标签: core-graphics cocoa-bindings key-value-coding

我正在尝试将我的一个对象上的CGColorRef绑定到shadowColor的“CALayer”属性。不幸的是,我无法弄清楚这一点 - 它可能非常简单!

CGColorRef实现为属性:

@property (readwrite) CGColorRef labelShadowColor;

我的约束也很直接:

[aLayer bind:@"shadowColor" toObject:aScreen withKeyPath:@"labelShadowColor" options:nil];

我要解开的地方是valueForUndefinedKey: - 我如何为CGColorRef实现此目标?我目前正在获取样板:

2009-08-09 03:13:50.056 Hyperspaces[33161:a0f] An uncaught exception was raised
2009-08-09 03:13:50.060 Hyperspaces[33161:a0f] [<HSScreen 0x100533930> valueForUndefinedKey:]: this class is not key value coding-compliant for the key labelShadowColor.
2009-08-09 03:13:50.064 Hyperspaces[33161:a0f] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<HSScreen 0x100533930> valueForUndefinedKey:]: this class is not key value coding-compliant for the key labelShadowColor.'

我可以通过在两端放置NSColor属性并在颜色更改时手动设置CALayer的“shadowColor”来解决此问题,但这似乎不够优雅。< / p>

1 个答案:

答案 0 :(得分:1)

好的,所以这是我错过的一个提示(以及我是如何解决的):

您无法合成CGColorRefs(@synthesize someProperty;) - 您需要声明属性@dynamic并实现getter / setter,如下所示:

@dynamic labelShadowColor;
- (CGColorRef)labelShadowColor {
    return labelShadowColor;
}

- (void)setLabelShadowColor:(CGColorRef)aShadowColor {
    if (CGColorEqualToColor(labelShadowColor,aShadowColor)) return;

    CGColorRelease(labelShadowColor);
    if (aShadowColor != NULL) {
        labelShadowColor = CGColorRetain(aShadowColor);
    }
}

然后您还需要在班级中定义valueForUndefinedKey:

- (id)valueForUndefinedKey:(NSString *)key {
  if ([key isEqualToString:@"labelShadowColor"]) {
    return (id)self.labelShadowColor;
  }

  return [super valueForUndefinedKey:key];
}

完成这两件事之后,我的绑定就开始了!