我试图在由sqlite数据库支持的核心数据存储中存储PNG图像。由于我打算在iPhone上使用此数据库,因此无法直接存储NSImage
对象。我想使用绑定和NSValueTransformer
子类来处理从NSImage
(通过我的GUI上的Image well获得)转换为包含图像的PNG二进制表示的NSData
的转码。我写了下面的代码为NSValueTransformer
:核心数据,绑定,值转换器:保存时崩溃
+ (Class)transformedValueClass
{
return [NSImage class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
if (value == nil) return nil;
return [[[NSImage alloc] initWithData:value] autorelease];
}
- (id)reverseTransformedValue:(id)value
{
if (value == nil) return nil;
if(![value isKindOfClass:[NSImage class]])
{
NSLog(@"Type mismatch. Expecting NSImage");
}
NSBitmapImageRep *bits = [[value representations] objectAtIndex: 0];
NSData *data = [bits representationUsingType:NSPNGFileType properties:nil];
return data;
}
该模型具有此NSValueTransformer
配置变形特性。在Interface Builder中,表格列和图像井都绑定到该属性,并且都具有正确的值转换器名称(图像中放置的图像很好地显示在表格列中)。每次添加图像或重新载入行时都会注册并调用转换器(使用NSLog()
调用进行检查)。当我试图保存管理对象时,问题就出现了。控制台输出显示错误消息:
[NSImage中长度]:无法识别的选择发送到实例0x1004933a0
好像核心数据使用值变压器,以获得NSImage
背面从NSData
和然后尝试保存NSImage
而不是NSData
。
有可能的解决方法,如在this post中提出的解决方法,但我真的想明白为什么我的方法是瑕疵。
在此先感谢您的想法和解释。
我没有指定变压器两次,并得到相同的错误。颠倒transformedValue:和reverseTransformedValue:取得了诀窍。非常感谢! – MartinW 2014-11-05 15:06:23