デフォルトの動作であるバイト配列を使用して保存されている色が気に入らなかったため、保存のためにNSValueTransformer
変換(および変換)できるカスタムを作成しました。IB 内で custom-transformer を設定すると、KVO でも機能します。もちろん、コード内で静的メソッドを呼び出して変換を実行することもできます。NSColor
NSString
NSUserDefaults
これを次のように作り直すのは、たいへんな作業ではないはずですUIColor
:
StringColorTransformer.h:
#import <Cocoa/Cocoa.h>
@interface StringColourTransformer : NSValueTransformer
+ (NSString *)toString:(NSColor *)value;
+ (NSColor *)fromString:(NSString *)value;
@end
StringColorTransformer.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 [NSString 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