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)。