1

CGColorRefオブジェクトの1つをの" 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's " "を設定することでこれを回避できますが、それはエレガントではないようです。shadowColor

4

1 に答える 1

1

さて、これが私が見逃したヒント(そして私がそれをどのように解決したか)です:

CGColorRefs(@synthesize someProperty;)を合成することはできません-プロパティを宣言し@dynamic、次のようにゲッター/セッターを実装する必要があります。

@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];
}

これらの2つのことが行われると、私のバインディングが実行に移されました。

于 2009-08-08T17:34:57.140 に答える