Почему мой поддающийся преобразованию Базовый атрибут Данных, не используя мой пользовательский NSValueTransformer?

Вы не можете включать два различных языка в тот же проект, но можно объединить их использующий ilmerge. Чтобы сделать это, поместите оба проекта в то же решение и сошлитесь на модуль F#, как Вы были бы любой dll. Как часть Вашего сценария развертывания, выполненный ilmerge для объединения EXE-файла и dll файла в единственный EXE-файл. Посмотрите этот статья Code Project , которая детализирует, как использовать ilmerge для создания exe.

10
задан Rob Keniger 21 October 2009 в 03:34
поделиться

5 ответов

Оказывается, на самом деле это ошибка фреймворка. См. Это сообщение сотрудника Apple в списке рассылки Cocoa-Dev:

http://lists.apple.com/archives/Cocoa-dev/2009/Dec/msg00979.html

2
ответ дан 3 December 2019 в 14:53
поделиться

If I'm not mistaken, your value transformer has a reversed direction. I do the same thing in my application, using code like the following:

+ (Class)transformedValueClass 
{
 return [NSData class]; 
}

+ (BOOL)allowsReverseTransformation 
{
 return YES; 
}

- (id)transformedValue:(id)value 
{
 if (value == nil)
  return nil;

 // I pass in raw data when generating the image, save that directly to the database
 if ([value isKindOfClass:[NSData class]])
  return value;

 return UIImagePNGRepresentation((UIImage *)value);
}

- (id)reverseTransformedValue:(id)value
{
 return [UIImage imageWithData:(NSData *)value];
}

While this is for the iPhone, you should be able to swap in your NSImage code at the appropriate locations. I simply haven't tested my Mac implementation yet.

All I did to enable this was to set my image property to be transformable within the data model, and specify the name of the transformer. I didn't need to manually register the value transformer, as you do in your +initialize method.

25
ответ дан 3 December 2019 в 14:53
поделиться

Если ничто в вашем коде в другом месте не использует класс PNGDataValueTransformer, то метод + initialize для этого класса никогда не будет вызван. Указание имени в вашей модели Core Data также не вызовет его - он просто попытается найти преобразователь значений для этого имени, который вернет nil, поскольку ни один экземпляр преобразователя еще не был зарегистрирован под этим именем.

Если это действительно то, что происходит в вашем случае, просто добавьте вызов к [PNGDataValueTransformer initialize] где-нибудь в вашем коде до того, как будет получен доступ к вашей модели данных, например, в методе + initialize любого класса, который использует эту модель данных. Это должно вызвать создание и регистрацию экземпляра преобразователя значений, чтобы Core Data мог получить к нему доступ, когда это необходимо.

0
ответ дан 3 December 2019 в 14:53
поделиться

Похоже, регистрация трансформатора не влияет на то, будет ли его использовать Core Data или нет. Я играл с примером кода PhotoLocations, и удаление регистрации трансформатора не имеет никакого эффекта. Пока ваше ValueTransformerName является именем вашего класса и что реализация вашего преобразователя включена в цель, он должен работать.

Если в преобразователе нет выполнения кода, то код в преобразователе не имеет значения. Проблема должна быть где-то еще в стеке основных данных или в объявлении преобразователя.

3
ответ дан 3 December 2019 в 14:53
поделиться

Проверить код примера здесь .

Делает ли это то, что вы хотите?

@implementation UIImageToDataTransformer


+ (BOOL)allowsReverseTransformation {
    return YES;
}

+ (Class)transformedValueClass {
    return [NSData class];
}


- (id)transformedValue:(id)value {
    NSData *data = UIImagePNGRepresentation(value);
    return data;
}


- (id)reverseTransformedValue:(id)value {
    UIImage *uiImage = [[UIImage alloc] initWithData:value];
    return [uiImage autorelease];
}
0
ответ дан 3 December 2019 в 14:53
поделиться