CoreDataに追加するbase64でデコードされたPNG画像を含むJSONがあります。これらの画像を、CoreDataモデルにバインドされたImageWellsに表示したいと思います。
問題は、非推奨になっているため、でData
使用できないことです。NSArchiveFromData
私の問題はこれに似ていますが、答えがよくわかりません。
誰かアイデアがありますか?
ありがとう
CoreDataに追加するbase64でデコードされたPNG画像を含むJSONがあります。これらの画像を、CoreDataモデルにバインドされたImageWellsに表示したいと思います。
問題は、非推奨になっているため、でData
使用できないことです。NSArchiveFromData
私の問題はこれに似ていますが、答えがよくわかりません。
誰かアイデアがありますか?
ありがとう
これを実現するために何かを試してください(プロパティのバインディングを使用しているのか、NSArrayControllerを使用しているのかわかりません-両方のシナリオに答えようとします)
jsonから文字列を取得してデコードすることができます:(stackoverflowの回答で参照されているオープンソースライブラリが必要です:https ://stackoverflow.com/questions/14260936/decode-an-encoded-base64-image-in -c-sharp-in-objective-c)
NSString *jsonImage = [jsonData objectForKey@"image"];
NSData *data = [NSData dataWithBase64EncodedString:jsonImage];
次に、そのデータで画像を初期化します。
NSArrayControllerを使用してコアデータを管理している場合は、画像を返す値トランスフォーマーを作成します。
NSValueTransformerのサブクラスを作成し、好きな名前を付けます。実装では、以下を追加します。
+(Class)transformedValueClass {
return [NSImage class];
}
-(id)transformedValue:(id)value {
if (value == nil) {
return nil;
} else {
NSData *data = [NSData dataWithBase64EncodedString:value]; //might be [value stringValue]
return [[NSImage alloc] initWithData:data];
}
}
次に、画像にバインディングを設定したInterface Builderで、ValueTransformerを作成したクラスに設定するだけです。
あなたは自分の問題が正確に何であるかを定義していませんでした。
NSDataからNSImageをロードするには、Appleのドキュメントとを参照してくださいinitWithData:
。
あなたがそのようなコアデータオブジェクトを持っているとしましょう:
@class MyObject : NSManagedObject
@property NSData *imageData;
@end
そしてそれは実装です:
@implementation MyObject
@dynamic imageData;
@end
次に、新しいプロパティを追加します。
-(NSImage *)bindableImage {
[self willAccessValueForKey:@"bindableImage"];
NSImage *myImage = [[NSImage alloc] initWithData:[self imageData]];
[self didAccessValueForKey:@"bindableImage"];
return myImage;
}
また、imageDataプロパティが変更されたときに何が変更されるかをバインディングに通知します。
+ (NSSet *)keyPathsForValuesAffectingImageData {
return [NSSet setWithObjects:@"bindableImage", nil];
}
それでおしまい。私はそれがうまくいくはずだと思いますが、私は試しませんでした:)
Base64を忘れました-別の答えを確認してください。