Вы не можете включать два различных языка в тот же проект, но можно объединить их использующий ilmerge. Чтобы сделать это, поместите оба проекта в то же решение и сошлитесь на модуль F#, как Вы были бы любой dll. Как часть Вашего сценария развертывания, выполненный ilmerge для объединения EXE-файла и dll файла в единственный EXE-файл. Посмотрите этот статья Code Project , которая детализирует, как использовать ilmerge для создания exe.
Оказывается, на самом деле это ошибка фреймворка. См. Это сообщение сотрудника Apple в списке рассылки Cocoa-Dev:
http://lists.apple.com/archives/Cocoa-dev/2009/Dec/msg00979.html
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.
Если ничто в вашем коде в другом месте не использует класс PNGDataValueTransformer, то метод + initialize для этого класса никогда не будет вызван. Указание имени в вашей модели Core Data также не вызовет его - он просто попытается найти преобразователь значений для этого имени, который вернет nil, поскольку ни один экземпляр преобразователя еще не был зарегистрирован под этим именем.
Если это действительно то, что происходит в вашем случае, просто добавьте вызов к [PNGDataValueTransformer initialize] где-нибудь в вашем коде до того, как будет получен доступ к вашей модели данных, например, в методе + initialize любого класса, который использует эту модель данных. Это должно вызвать создание и регистрацию экземпляра преобразователя значений, чтобы Core Data мог получить к нему доступ, когда это необходимо.
Похоже, регистрация трансформатора не влияет на то, будет ли его использовать Core Data или нет. Я играл с примером кода PhotoLocations, и удаление регистрации трансформатора не имеет никакого эффекта. Пока ваше ValueTransformerName является именем вашего класса и что реализация вашего преобразователя включена в цель, он должен работать.
Если в преобразователе нет выполнения кода, то код в преобразователе не имеет значения. Проблема должна быть где-то еще в стеке основных данных или в объявлении преобразователя.
Проверить код примера здесь .
Делает ли это то, что вы хотите?
@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];
}