2009-08-08 4 views
1

J'essaye de lier un CGColorRef sur un de mes objets à la propriété "shadowColor" d'un CALayer. Malheureusement, je n'ai pas été capable de comprendre cela - c'est probablement quelque chose de très simple!Liaisons Cocoa et KVC avec CGColorRef

Le CGColorRef est mis en œuvre comme une propriété:

@property (readwrite) CGColorRef labelShadowColor; 

Ma fixation est simple aussi:

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

où je viens décollée est valueForUndefinedKey: - comment pourrais-je mettre en œuvre cela pour un CGColorRef ? Je suis actuellement obtenir le passe-partout:

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

je peux contourner ce problème en mettant NSColor la propriété sur les deux extrémités et le réglage de la « shadowColor » de CALayer manuellement à chaque fois que la couleur est modifiée, mais qui semble inélégant.

Répondre

1

OK, alors voici une astuce que je manqué (et comment je l'ai résolu):

Vous ne pouvez pas synthétiser CGColorRefs (@synthesize someProperty;) - vous devez déclarer la propriété @dynamic et mettre en œuvre les getters/setters, comme si:

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

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

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

besoin Ensuite, vous aurez également définir valueForUndefinedKey: dans votre classe:

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

    return [super valueForUndefinedKey:key]; 
} 

Une fois ces deux choses ont été faites, mes liaisons sont entrées en action!

+0

Cela, étonnamment, fonctionne. WTF auriez-vous besoin de déclarer 'valueForUndefinedKey', alors qu'en fait - il est défini? Totalement contre-intuitif. Comment avez-vous compris cela? –

+0

Honnêtement, c'était il y a près de 4 ans. Assez sûr que c'était un bug/détail de la façon dont les types CG * fonctionnaient avec les propriétés à la fois, mais je ne me souviens pas précisément pourquoi/comment je suis arrivé à cette conclusion. Est-ce que ça marche encore? Je ne pense pas que ce soit nécessaire sur iOS (utilisez simplement UIColor). –

Questions connexes