何が原因で問題が発生しているのかはわかりませんが、簡単に調べる方法があります。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 またはその他の必要なメソッドを使用できます。