我試圖在由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