2012-06-08 2 views
0

В настоящее время у меня есть база данных Core Data, в которой хранятся данные, и я хочу также сохранить в ней NSColor, но он не принимает NSColor как объект. Мое решение состояло в том, чтобы сохранить его в виде строки в базе данных и прочитать ее в NSColor при загрузке. Как мне это сделать?Храните NSColor в виде строки

Например, если у меня был цвет [NSColor redColor], как бы я хранил его в базе данных (как строку), а затем извлекал его. Это базовый пример, и в конце это будет более сложными цветами RGB.

Спасибо.

ответ

2

NSColor поддерживает NSCoding protocol, так что вы можете использовать метод -encodeWithCoder:, чтобы сохранить его в архив, и вы можете использовать -initWithCoder:, чтобы загрузить его из архива.

4

Вам следует рассмотреть возможность использования NSData в качестве контейнера для хранения неподдерживаемых типов данных в Core Data. Чтобы получить доступ к NSColor как NSData, вам нужно будет пометить атрибут как трансформируемый и создать обратимый класс NSValueTransformer для преобразования NSColor в NSData.

Полезные ссылки: Non-Standard Persistent Attributes

0

Списки свойств не хранят цвета и Apple, рекомендует хранить их в NSData не как NSString, вероятно, вы должны сделать то же самое. См. Инструкции Apple here.

3

Я согласен с ответами, которые рекомендуют использовать NSData для хранения цветов в хранилище основных данных. Тем не менее, могут быть моменты, когда может быть полезно сохранить цвет в строке, и это, безусловно, не сложно сделать. Я хотел бы предложить создать категорию на NSColor:

@interface NSColor (NSString) 
- (NSString*)stringRepresentation; 
+ (NSColor*)colorFromString:(NSString*)string forColorSpace:(NSColorSpace*)colorSpace; 
@end 

@implementation NSColor (NSString) 

- (NSString*)stringRepresentation 
{ 
    CGFloat components[10]; 

    [self getComponents:components]; 
    NSMutableString *string = [NSMutableString string]; 
    for (int i = 0; i < [self numberOfComponents]; i++) { 
     [string appendFormat:@"%f ", components[i]]; 
    } 
    [string deleteCharactersInRange:NSMakeRange([string length]-1, 1)]; // trim the trailing space 
    return string; 
} 

+ (NSColor*)colorFromString:(NSString*)string forColorSpace:(NSColorSpace*)colorSpace 
{ 
    CGFloat components[10]; // doubt any color spaces need more than 10 components 
    NSArray *componentStrings = [string componentsSeparatedByString:@" "]; 
    int count = [componentStrings count]; 
    NSColor *color = nil; 
    if (count <= 10) { 
     for (int i = 0; i < count; i++) { 
      components[i] = [[componentStrings objectAtIndex:i] floatValue]; 
     } 
     color = [NSColor colorWithColorSpace:colorSpace components:components count:count]; 
    } 
    return color; 
} 

@end 

Я проверил, что приведенный выше код компилируется и работает примерно как рекламируется. Небольшой образец программа выдает соответствующий вывод:

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     NSLog(@"Red is: %@", [[NSColor redColor] stringRepresentation]); 
     NSLog(@"Cyan is: %@", [[NSColor cyanColor] stringRepresentation]); 
     NSLog(@"Read in: %@", [NSColor colorFromString:[[NSColor redColor] stringRepresentation] 
             forColorSpace:[NSColorSpace deviceRGBColorSpace]]); 
    } 
    return 0; 
} 

Выход:

Red is: 1.000000 0.000000 0.000000 1.000000 
Cyan is: 0.000000 1.000000 1.000000 1.000000 
Read in: NSCustomColorSpace Generic RGB colorspace 1 0 0 1 

Это может иметь смысл для сохранения цветового пространства в строке, так что вы не должны указывать его при переходе из строки раскрасить. Опять же, если вы просто собираетесь хранить эти строки и читать их снова, вы все равно должны использовать NSData. Использование строк имеет больше смысла, если вам нужно писать цвета в какой-то читаемый человеком файл или, возможно, в качестве вспомогательной помощи.

Смежные вопросы