상당히 간단한 데이터 모델을 사용하는 핵심 데이터 앱이 있습니다. 공간을 절약하기 위해 PNG 비트 맵 NSData 객체로 영구 저장소에 NSImage의 인스턴스를 저장할 수 있기를 원합니다.변환 가능한 핵심 데이터 속성이 내 사용자 지정 NSValueTransformer를 사용하지 않는 이유는 무엇입니까?
이 목적을 위해 간단한 NSValueTransformer를 작성하여 NSImage를 PNG 비트 맵 형식의 NSData로 변환했습니다. 내 응용 프로그램 위임에이 코드 값 변압기를 등록하고 :
+ (void)initialize
{
[NSValueTransformer setValueTransformer:[[PNGDataValueTransformer alloc] init] forName:@"PNGDataValueTransformer"];
}
을 내 데이터 모델에서, 나는, 변형 할 이미지 속성을 설정하고 값 변압기 이름으로 PNGDataValueTransformer
지정했습니다.
그러나 사용자 정의 값 변환기가 사용되지 않습니다. 로그에 기록되지 않는 값 변환기의 -transformedValue:
및 -reverseTransformedValue
메소드에 로그 메시지를 넣었 기 때문에 디스크에 저장되는 데이터는 보관 된 NSImage가 아니라 PNG NSData 객체입니다.
왜 작동하지 않습니까?
@implementation PNGDataValueTransformer
+ (Class)transformedValueClass
{
return [NSImage class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
if (value == nil) return nil;
if(NSIsControllerMarker(value))
return value;
//check if the value is NSData
if(![value isKindOfClass:[NSData class]])
{
[NSException raise:NSInternalInconsistencyException format:@"Value (%@) is not an NSData instance", [value class]];
}
return [[[NSImage alloc] initWithData:value] autorelease];
}
- (id)reverseTransformedValue:(id)value;
{
if (value == nil) return nil;
if(NSIsControllerMarker(value))
return value;
//check if the value is an NSImage
if(![value isKindOfClass:[NSImage class]])
{
[NSException raise:NSInternalInconsistencyException format:@"Value (%@) is not an NSImage instance", [value class]];
}
// convert the NSImage into a raster representation.
NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData: [(NSImage*) value TIFFRepresentation]];
// convert the bitmap raster representation into a PNG data stream
NSDictionary* pngProperties = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:NSImageInterlaced];
// return the png encoded data
NSData* pngData = [bitmap representationUsingType:NSPNGFileType properties:pngProperties];
return pngData;
}
@end
안녕 브라이언의'+ initialize' 방법은 내 응용 프로그램 위임에 값이 아닌, 변압기와 나는 확실히 확인할 수 있습니다 그것은 불리고있다. 내 NSValueTransformer의'-init' 메소드에 중단 점을 넣으면 확실히 초기화됩니다. "binary"유형으로 속성을 설정하고 IB의 각 바인딩에 값 변환기를 적용하면 정상적으로 작동합니다. 속성 형식을 변형 가능으로 지정할 때 사용자 지정 변환기가 사용되지 않는 이유를 이해하지 못합니다. –