Я перефразирую определенный ответ, который я нашел в Подробнее о разработке iPhone 3 Дэйва Марка и Джеффа ЛеМарша:
Обычно мы можем оставить класс преобразователя трансформируемого атрибута по умолчанию, NSKeyedUnarchiveFromData , и это будет сделано, но в этом случае мы не можем, потому что UIColor
этого не делает соответствует NSCoding
и не может быть заархивирован с помощью NSKeyedArchiver
. Мы должны вручную написать преобразователь значения для обработки преобразования.
Добавьте атрибут к вашей сущности и назовите атрибут «цвет», или любое другое имя, которое вы пожелаете. Установите его тип Transformable . Установите для его «Имя преобразователя значения» значение UIColorRGBValueTransformer . Обратите внимание, что редактор модели данных не проверяет Value Transformer Name: , чтобы убедиться, что это допустимый класс, поэтому набирайте внимательно.
Создайте новый файл, подкласс NSObject
и назовите его UIColorRGBValueTransformer.m .
Нажмите UIColorRGBValueTransformer.h и измените суперкласс с NSObject на NSValueTransformer. Кроме того, измените #import <Foundation/Foundation.h>
на #import <UIKit/UIKit.h>
, поскольку UIColor
является частью UIKit
, а не Foundation
.
Теперь в UIColorRGBValueTransformer.m нам нужно реализовать четыре метода, которые позволяют нашему классу преобразователя значений преобразовывать экземпляры UIColor
в NSData
и наоборот. Включите следующий код в UIColorRGBValueTransformer.m :
#import "UIColorRGBValueTransformer.h"
@implementation UIColorRGBValueTransformer
// Here we override the method that returns the class of objects that this transformer can convert.
+ (Class)transformedValueClass {
return [NSData class];
}
// Here we indicate that our converter supports two-way conversions.
// That is, we need to convert UICOLOR to an instance of NSData and back from an instance of NSData to an instance of UIColor.
// Otherwise, we wouldn't be able to beth save and retrieve values from the persistent store.
+ (BOOL)allowsReversTransformation {
return YES;
}
// Takes a UIColor, returns an NSData
- (id)transfomedValue:(id)value {
UIColor *color = value;
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]];
return [colorAsString dataUsingEncoding:NSUTF8StringEncoding];
}
// Takes an NSData, returns a UIColor
- (id)reverseTransformedValue:(id)value {
NSString *colorAsString = [[[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding] autorelease];
NSArray *components = [colorAsString componentsSeparatedByString:@","];
CGFloat r = [[components objectAtIndex:0] floatValue];
CGFloat g = [[components objectAtIndex:1] floatValue];
CGFloat b = [[components objectAtIndex:2] floatValue];
CGFloat a = [[components objectAtIndex:3] floatValue];
return [UIColor colorWithRed:r green:g blue:b alpha:a];
}
@end
Теперь в другом файле вы можете включить строку кода, например:
[self.managedObject setValue:color forKey:self.keyPath];
без необходимости импортировать UIColorRGBValueTransformer.h в файл.