2013-02-28 138 views
0

我想了解核心数据如何工作。为此,我一直试图推行一个名为“颜色”这些属性的简单实体:根据其他属性设置核心数据属性

  • 值 - >一个NSColor来处理本身的颜色,绑定到NSColorWell
  • 红 - >浮点数值处理的颜色的红色成分,结合于NSSlider
  • 绿色 - >相同红色,但对于绿色分量,结合于NSSlider
  • 蓝 - >蓝色分量,结合于NSSlider

对于这我使用一个名为颜色我已经覆盖 - (id)的值,使色彩取决于组件:

@implementation Color 

@dynamic blue; 
@dynamic green; 
@dynamic name; 
@dynamic red; 
@dynamic value; 

- (id)value 
{ 
    return [NSColor colorWithCalibratedRed:self.red.floatValue green:self.green.floatValue blue:self.blue.floatValue alpha:1.0]; 
} 


+ (NSSet *)keyPathsForValuesAffectingValue 
{ 
    return [NSSet setWithArray:@[@"red", @"green", @"blue"]]; 
} 

我每次更改滑块值的颜色适应这些组件。

我想要做的是相反的操作,当我设置颜色(拖放或NSColorWell的颜色选择器)的组件适应自己。 我试图实现这一点,但它从来没有工作。我已经尝试了太多的东西来粘贴它们(这是无关紧要的,因为它不起作用)。 我该怎么做?了解这一点可以帮助我理解Core Data的工作原理。

+0

您是否尝试过实现自定义setter'setValue'? - 实际上,我不会使用“value”作为属性名称,以避免与所有这些键值方法(如setValue:forKeyPath等)发生冲突。 – 2013-02-28 19:20:10

+0

您正确实施'setValue:'解决了问题。我现在将发布工作代码。谢谢:)(这个名字不是问题,我认为,因为它在很多苹果的类上使用,比如NSControl) – Pyroh 2013-02-28 21:40:04

回答

0

因此,这里是一段代码,使得它的工作:

@implementation Color 

@dynamic blue; 
@dynamic green; 
@dynamic name; 
@dynamic red; 
@dynamic value; 

- (id)value 
{ 
    return [NSColor colorWithCalibratedRed:self.red.floatValue green:self.green.floatValue blue:self.blue.floatValue alpha:1.0]; 
} 

- (void)setValue:(id)value 
{ 
    [self willChangeValueForKey:@"value"]; 
    [self setPrimitiveValue:value forKey:@"value"]; 
    [self didChangeValueForKey:@"value"]; 
    [self setRed:@([(NSColor *)value redComponent])]; 
    [self setGreen:@([(NSColor *)value greenComponent])]; 
    [self setBlue:@([(NSColor *)value blueComponent])]; 
} 

+ (NSSet *)keyPathsForValuesAffectingValue 
{ 
    return [NSSet setWithArray:@[@"red", @"green", @"blue"]]; 
} 

现在我可以在HSB滑块工作。