2014-10-27 24 views
1

在數據模型中,我將顏色定義爲可變形屬性並將ColorTransformer分配給它。它的工作原理,在同一個轉換器的幫助下,我可以將它綁定到ColorPicker,保存並打開文檔。 Screenshot from data model 但是,當我嘗試從代碼訪問它:爲什麼我的NSColor類NSConcreteData?

NSColor * color = corner.color; 
NSLog(@"Corner Color = %@\n%@", color, color.class); 

我有NSMutableConcreteData的對象:

bezierMesh[22164:730708] Corner Color = <040b7374 7265616d 74797065 6481e803 84014084 8484074e 53436f6c 6f720084 84084e53 4f626a65 63740085 84016301 84046666 66660183 6eb7613d 8357703e 3e8352b8 1e3f86> 
NSConcreteMutableData 

修改getter和setter沒有幫助:

- (NSColor *)color { 

    [self willAccessValueForKey:@"color"]; 
    NSData *colorData = [self primitiveValueForKey:@"color"]; 
    [self didAccessValueForKey:@"color"]; 
    if (colorData == nil) { 
     return nil; 
    } 


    NSColor * color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData]; 
    return color; 
    } 

- (void)setColor:(NSColor *)color { 
    NSLog(@" -------------- > Setting color %@", color); 
    NSData * theData=[NSArchiver archivedDataWithRootObject:color]; 
    [self willChangeValueForKey:@"color"]; 
    [self setPrimitiveValue:theData forKey:@"color"]; 
    [self didChangeValueForKey:@"color"]; 
} 

它導致錯誤:

​​

如何獲取顏色NSColor?

+0

這是我們在這裏討論的'NSValueTransformer'子類嗎?如果是這樣,那麼這不是你如何從代碼中使用它。 – trojanfoe 2014-10-27 13:49:18

+0

BMColorTransformer是NSTransformer的子類。但也許有一個正確的問題:如何在代碼中使用NSTransformer子類? – 2014-10-27 17:29:16

+0

NSValueTransformer當然是 – 2014-10-27 17:47:27

回答

1

下面是一個NSString < - >NSColor變壓器我寫了一段時間後,它被設計用於存儲顏色使用內NSUserDefaults的RGB值,因爲我不喜歡默認使用NSData對象:

StringColourTransformer.h :

@interface StringColourTransformer : NSValueTransformer 

+ (NSString *)toString:(NSColor *)value; 
+ (NSColor *)fromString:(NSString *)value; 

@end 

StringColourTransformer.m:

#import "StringColourTransformer.h" 

@implementation StringColourTransformer 

+ (NSString *)toString:(NSColor *)value { 
    StringColourTransformer *transformer = [[StringColourTransformer alloc] init]; 
    NSString *str = [transformer reverseTransformedValue:value]; 
    return str; 
} 

+ (NSColor *)fromString:(NSString *)value { 
    StringColourTransformer *transformer = [[StringColourTransformer alloc] init]; 
    NSColor *color = (NSColor *)[transformer transformedValue:value]; 
    return color; 
} 

+ (Class)transformedValueClass { 
    return [NSColor class]; 
} 

+ (BOOL)allowReverseTransformation { 
    return YES; 
} 

- (id)transformedValue:(id)value { 
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0; 

    // Only NSString classes are reverse-transformed 
    if ([value isKindOfClass:[NSString class]]) { 
     NSString *stringValue = (NSString *)value; 
     sscanf([stringValue UTF8String], 
#ifdef __x86_64 
       "%lf %lf %lf %lf", 
#else 
       "%f %f %f %f", 
#endif 
       &r, &g, &b, &a); 
    } 

    return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; 
} 

- (id)reverseTransformedValue:(id)value { 
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0; 

    // Only NSColor classes are transformed 
    if ([value isKindOfClass:[NSColor class]]) { 
     NSColor *colourValue = (NSColor *)value; 
     NSColor *converted = [colourValue colorUsingColorSpaceName:@"NSCalibratedRGBColorSpace"]; 
     [converted getRed:&r green:&g blue:&b alpha:&a]; 
    } 

    return [NSString stringWithFormat:@"%.3f %.3f %.3f %.3f", r, g, b, a]; 
} 

@end 

正如你所看到的,我已經提供了幾種類的方法來使代碼更容易使用(toStringfromString)。

它需要在應用生命週期的早期註冊,以便它可用於內IB變換值(這是從一個單其中_stringColourTransformer是一個實例變量調用):

_stringColourTransformer = [[StringColourTransformer alloc] init]; 
[NSValueTransformer setValueTransformer:_stringColourTransformer 
           forName:@"StringColourTransformer"]; 

和轉化是就這麼簡單:

NSColor *colour = [StringColourTransformer fromString:@"1.0 1.0 0.0 1.0"]; 

注:看代碼,現在我可能會使用[NSValueTranformer valueTransformerForName:]toString/fromString方法,而不是每次都創建一個新的實例。這可能更便宜。

1

如果您的問題是關於如何在Core Data中存儲UIColor(或OSC X上的NSColor)對象...:NSValueTransformer不是必需的。核心數據建模器中的以上條目「名稱」必須爲空(現在有:「BMColorTransformer」)。

實體( 「邁德特」)接口(使用NSColor因此與OS X),然後看起來像這樣的代碼:

@interface MyData : NSManagedObject 

// other attributes ... 
@property (nonatomic, retain) UIColor * color; 

@end 

和實施...

@implementation MyData 

// other attributes ... 
@dynamic color; 

@end 

但是,如果你不不想將UIColor(或NSColor)存儲爲NSData - 這會導致Sqlite數據庫中出現BLOB格式 - 您需要編寫一個類似於@trojanfoe發佈的NSValueTransformer。他說「我不喜歡默認使用NSData」 - 我想他更喜歡可讀的格式,而不是二進制格式(??)。

+0

那麼簡單。 順便說一句。我的BTColorTransformer有 - (NSColor *)...而不是+(顏色*)... 現在的作品! – 2014-10-29 15:58:36