Core graphics Cocoa绑定和带有CGColorRef的KVC

Core graphics Cocoa绑定和带有CGColorRef的KVC,core-graphics,cocoa-bindings,key-value-coding,Core Graphics,Cocoa Bindings,Key Value Coding,我正在尝试将一个对象上的CGColorRef绑定到CALayer的“shadowColor”属性。不幸的是,我还没有弄明白这一点——这可能是非常简单的事情 CGColorRef作为一个属性实现: @property (readwrite) CGColorRef labelShadowColor; 我的装订也很简单: [aLayer bind:@"shadowColor" toObject:aScreen withKeyPath:@"labelShadowColor" options:nil];

我正在尝试将一个对象上的
CGColorRef
绑定到
CALayer
的“
shadowColor
”属性。不幸的是,我还没有弄明白这一点——这可能是非常简单的事情

CGColorRef作为一个属性实现:

@property (readwrite) CGColorRef labelShadowColor;
我的装订也很简单:

[aLayer bind:@"shadowColor" toObject:aScreen withKeyPath:@"labelShadowColor" options:nil];
我要解决的问题是
valueforundfinedkey:
-如何为
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.'
2009-08-09 03:13:50.056超空间[33161:a0f]引发了未捕获的异常
2009-08-09 03:13:50.060超空间[33161:a0f][valueForUndefinedKey:]:此类不符合键标签HadowColor的键值编码。
2009-08-09 03:13:50.064超空间[33161:a0f]***由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:]:此类不符合密钥标签ShadowColor的键值编码。”

我可以通过在两端放置一个
NSColor
属性,并在颜色改变时手动设置
CALayer
的“
shadowColor
”,来解决这个问题,但这似乎不雅观。

好,下面是我错过的一个技巧(以及我是如何解决的):

您不能合成CGColorRefs(
@synthesis 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);
    }
}
然后还需要在类中定义
valueforundfinedkey:

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

  return [super valueForUndefinedKey:key];
}

这两件事一做完,我的束缚就开始起作用了

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

您不能合成CGColorRefs(
@synthesis 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);
    }
}
然后还需要在类中定义
valueforundfinedkey:

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

  return [super valueForUndefinedKey:key];
}

这两件事一做完,我的束缚就开始起作用了

令人惊讶的是,这是有效的。WTF是否需要声明
valueForUndefinedKey
,而事实上它已定义?完全违反直觉。你是怎么知道的?老实说,那是将近4年前的事了。很确定这是CG*类型在当时如何处理属性的一个错误/细节,但我不记得我为什么/如何得出这个结论。它还能用吗?我不认为这在iOS上是必要的(只需使用UIColor)。令人惊讶的是,这是有效的。WTF是否需要声明
valueForUndefinedKey
,而事实上它已定义?完全违反直觉。你是怎么知道的?老实说,那是将近4年前的事了。很确定这是CG*类型在当时如何处理属性的一个错误/细节,但我不记得我为什么/如何得出这个结论。它还能用吗?我不认为这在iOS上是必要的(只需使用UIColor)。