Я не уверен, что происходит, чтобы вызвать вашу проблему, но есть простой способ выяснить. Подключите 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];
}
Затем в Интерфейсном Разработчике вы вставляете DataToImageTransformer для привязки. Теперь у вас есть контроль над связыванием, и вы можете делать, как я объяснил ранее в классе преобразователя. Обратите внимание, что я использую NSKeyedArchiver для преобразования NSImage в данные и обратно, но вы можете использовать tiffRepresentation или любой другой метод, который вы хотите использовать вместо него.