2009-08-08 9 views
1

Ich versuche, ein CGColorRef auf eines meiner Objekte an die "shadowColor" Eigenschaft eines CALayer zu binden. Leider konnte ich das nicht herausfinden - es ist wahrscheinlich etwas sehr Einfaches!Kakaobindungen und KVC mit CGColorRef

Die CGColorRef wird als Eigenschaft implementiert:

@property (readwrite) CGColorRef labelShadowColor; 

Meine Bindung ist gerade nach vorne zu:

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

Wo komme ich unstuck ist valueForUndefinedKey: - wie würde ich dies für eine CGColorRef implementieren ? Ich bin derzeit die vorformulierten bekommen:

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.' 

Ich kann, indem eine NSColor Eigenschaft an beiden Enden dieses Problem umgehen und Einstellung der CALayer ‚s‚shadowColor‘manuell, wenn die Farbe geändert wird, aber das scheint unelegant.

Antwort

1

OK, also hier eine Spitze, die ich verpasst (und wie ich es gelöst):

Sie können nicht CGColorRefs synthetisieren (@synthesize someProperty;) - Sie müssen die Eigenschaft @dynamic und implementieren die Getter/Setter erklären, wie so:

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

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

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

Dann müssen Sie auch valueForUndefinedKey: in Ihrer Klasse definieren:

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

    return [super valueForUndefinedKey:key]; 
} 

Sobald diese zwei Dinge waren gemacht, meine Bindungen sprangen in Aktion!

+0

Dies funktioniert erstaunlich. WTF müssten Sie 'valueForUndefinedKey' deklarieren, wenn tatsächlich - es definiert ist? Völlig kontraintuitiv. Wie hast du das herausgefunden? –

+0

Ehrlich gesagt, war es vor fast 4 Jahren. Ziemlich sicher, das war ein Bug/Detail, wie CG * -Typen mit Eigenschaften zu der Zeit gearbeitet haben, aber ich erinnere mich nicht genau, warum/wie ich zu dieser Schlussfolgerung kam. Funktioniert es noch? Ich würde mir nicht vorstellen, dass es auf iOS notwendig ist (benutze einfach UIColor). –

Verwandte Themen