我不确定是什么导致了您的问题,但有一种简单的方法可以找出答案。将 NSValueTransformer 连接到绑定。然后在那个转换器中,你可以记录一些东西来确定你是否传递了一个 nil 值,或者你可以将你的数据值转换为一个 NSImage 并将其传递回来......基本上你可以在转换器类中做任何你想做的事情。这是我在核心数据模型中用于图像数据的一个。
@interface DataToImageTransformer : NSValueTransformer {
}
@end
@implementation DataToImageTransformer
+ (Class)transformedValueClass {
return [NSImage class];
} // the class of the return value from transformedValue:
+ (BOOL)allowsReverseTransformation {
return YES;
} // if YES then must also have reverseTransformedValue:
- (id)transformedValue:(id)value {
if (value == nil || [value length] < 1) return nil;
NSImage* i = nil;
if ([value isKindOfClass:[NSData class]]) {
i = [NSKeyedUnarchiver unarchiveObjectWithData:value];
}
return i;
}
- (id)reverseTransformedValue:(id)value {
if (value == nil) return nil;
NSData* d = nil;
if ([value isKindOfClass:[NSImage class]]) {
d = [NSKeyedArchiver archivedDataWithRootObject:value];
}
return d;
}
@end
在 AppController 类中初始化转换器:
+ (void)initialize {
DataToImageTransformer *transformer = [[DataToImageTransformer alloc] init];
[NSValueTransformer setValueTransformer:transformer forName:@"DataToImageTransformer"];
[transformer release];
}
然后在 Interface Builder 中,您将“DataToImageTransformer”放入绑定中。现在您可以控制绑定,并且可以按照我之前在转换器类中解释的那样进行操作。请注意,我正在使用 NSKeyedArchiver 将 NSImage 转换为数据并再次转换回来,但您可以使用 tiffRepresentation 或您想要的任何其他方法来代替它。