Базовая модель данных Данных: припишите тип для UIColor

Я только начинаю с Базовыми Данными, и прямо сейчас я создаю свою модель данных. Мне нужен атрибут UIColor для моего объекта, но тип, выпадающий для атрибута, не имеет опции для этого. Я устанавливаю его на Неопределенный или что?

Спасибо

6
задан indragie 21 February 2010 в 05:19
поделиться

2 ответа

Вероятно, вам нужен преобразуемый атрибут. Прочитайте раздел "Нестандартные постоянные атрибуты" в Руководстве по программированию Core Data. Трансформируемый атрибут - это, под прикрытием, атрибут двоичных данных, но Core Data будет автоматически использовать NSValueTransformer вашей спецификации для сериализации и несериализации логического значения атрибута для вас. Для значений, которые соответствуют NSCoding, NSKeyedUnarchiveFromDataTransformerName (который является трансформатором по умолчанию) сделает все необходимое.

Конечно, Core Data не может индексировать или, для бэкенда SQLite, выполнять запросы к этому преобразуемому значению.

16
ответ дан 8 December 2019 в 02:16
поделиться

Я перефразирую точный ответ, который я нашел в 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 в файл файл.

20
ответ дан 8 December 2019 в 02:16
поделиться