Я только начинаю с Базовыми Данными, и прямо сейчас я создаю свою модель данных. Мне нужен атрибут UIColor для моего объекта, но тип, выпадающий для атрибута, не имеет опции для этого. Я устанавливаю его на Неопределенный или что?
Спасибо
Вероятно, вам нужен преобразуемый атрибут. Прочитайте раздел "Нестандартные постоянные атрибуты" в Руководстве по программированию Core Data. Трансформируемый атрибут - это, под прикрытием, атрибут двоичных данных, но Core Data будет автоматически использовать NSValueTransformer
вашей спецификации для сериализации и несериализации логического значения атрибута для вас. Для значений, которые соответствуют NSCoding
, NSKeyedUnarchiveFromDataTransformerName
(который является трансформатором по умолчанию) сделает все необходимое.
Конечно, Core Data не может индексировать или, для бэкенда SQLite, выполнять запросы к этому преобразуемому значению.
Я перефразирую точный ответ, который я нашел в More iPhone 3 Development Дэйва Марка и Джеффа ЛеМарша:
Обычно мы могли бы оставить класс преобразователя трансформируемого атрибута по умолчанию, NSKeyedUnarchiveFromData , и это будет сделано, но в этом случае мы не можем, потому что UIColor
не соответствует NSCoding
и не может быть заархивирован с помощью NSKeyedArchiver
. Нам нужно вручную написать преобразователь значений для обработки преобразования.
Добавьте атрибут к своей сущности и назовите атрибут «цвет» или как хотите. Установите его тип на Трансформируемый . Установите для параметра «Имя преобразователя значений» значение UIColorRGBValueTransformer . Обратите внимание, что редактор модели данных не проверяет Имя преобразователя значений: , чтобы убедиться, что это допустимый класс, поэтому вводите внимательно.
Создайте новый файл, подкласс NSObject
, и назовите его UIColorRGBValueTransformer.m .
Щелкните UIColorRGBValueTransformer.h и измените суперкласс с NSObject на NSValueTransformer. Также измените #import
на #import
, поскольку UIColor
является частью UIKit
, а не Фонд
.
Теперь в 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 в файл файл.