非常に簡単なことであるはずのことに固執しています:変換可能な属性として割り当てられたイメージをCore Data Entityストア/表示(バインディング経由)してください。イメージのコアデータの変形可能な属性の問題
私は(例えば、hereとhereを参照)スタック上の多くの関連記事を読んだが、それでもサンプルコードを開発し、他の記事(例えば、see hereなどhere)を調査した後、それとのトラブルを抱えています。これは以前の私のquestionに関連していますが、まだ解決していません。
問題を示すために、簡単なdocベースのCore Data Appを作成しました。コアデータ管理オブジェクトは「TheEntity」と属性「theImageAtt」と呼ばれます。コアデータで定義されたエンティティは(ImageValueTransformerがNSValueTransformerである)を以下に示す:
私は(私はそれを作るために「名前」属性のコードを残しXCodeのは、NSManagedObjectのサブクラスのヘッダファイルと実装ファイルを生成してみましょうより簡単に):
// TheEntity.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "ImageValueTransformer.h"
@interface TheEntity : NSManagedObject
@property (nonatomic, retain) NSImage * theImageAtt;
@end
-----------------------
// TheEntity.m
#import "TheEntity.h"
@implementation TheEntity
@dynamic theImageAtt;
@end
以下に、私の "ImageValueTransformer"のヘッダーと実装ファイルを示します。スタックや他の場所でのこの例の多くは(ティフ担当者は任意です)。
// ImageValueTransformer.h
#import <Foundation/Foundation.h>
@interface ImageValueTransformer : NSValueTransformer
@end
-------------------------------
// ImageValueTransformer.m
#import "ImageValueTransformer.h"
@implementation ImageValueTransformer
+ (BOOL)allowsReverseTransformation {return YES;}
+ (Class)transformedValueClass {
return [NSData class]; // have also tried: return [NSImage class];
}
- (id)transformedValue:(id)value {
NSData *data = [value TIFFRepresentation];
return data;
}
- (id)reverseTransformedValue:(id)value {
NSImage *imageRep = [[NSImage alloc] initWithData:value];
return imageRep;
}
@end
値TransformerでMyDocument.mでのインスタンスを割り当てることによって、登録/初期化することができるが、最終的に、それははるかに限りトランスヘッダがtheEntityヘッダーにインポートされる問題ではありません(上記を参照)。私はこれを実験したが、私が以下に示すエラーは取り除かない。参考までに、バリュートランスを登録する必要があります(CornPuffとBrian Websterのコメントを参照)。earlier discussion on whether or notがあります。
アップルの良いコード例は、値トランスの別の初期化を示すhereです。私もその設定を試しました。
- (IBAction)addImg:(id)sender {
NSImage *theImg = [[NSImage alloc] initWithContentsOfFile:@"/Desktop/testImage.jpg"];
//[theImageView setImage:theImg]; // as a test, this displays ok
// "theEntities" below are defined as an IBOutlet to my Array Controller:
[theEntities setValue:theImg forKeyPath:@"selection.theImageAtt"];
NSLog(@"after setting the image ..."); // this never logs
}
ゼロイングイン:行動にこれを置く
、Iは、テスト画像をロードし(NSTableで選択されたエンティティのインスタンスから)MyDocument.mにおける変形属性に割り当てる方法を有しますどこコードブレークに、以下の行:
[theEntities setValue:theImg forKeyPath:@"selection.theImageAtt"];
はエラーを与える:
Cannot create BOOL from object <4d4d002a 0003717e 8989898a 8a8a8b8b 8b8b8b8b
8a8a8a89 89898888 88878787 8a8a8a89 89898888 88888888 88888889 89898a8a
8a8a8a8a 8b8b8b88 88888787 87898989 8a8a8a89 89898a8a 8a8c8c8c 8b8b8b8a
8a8a8888 .... and so on for the size of the Image array ...
上記の行をコメントアウトすると、NSTableにはNothingが正しく埋め込まれているので(バインディングと配列コントローラはOK)、もちろんNSImageViewにはイメージがありません。
// Image to Data Conversion:
NSImage *imageIn = [[NSImage alloc] initWithContentsOfFile:@"testImage.jpg"];
NSData *imgData = [imageIn TIFFRepresentation];
NSImage *imageOut = [[NSImage alloc] initWithData:imgData];
[theImageDisplay setImage:imageOut];
私はこの上で何をしないのです:チェック、期待通りにトランスの動作イメージで使用される変換コード(これは、値の変圧器から個別にテストされた)として
?
イメージトランスフォーマーがコアデータで使用されているかどうかはまだ判断されていますか?つまり、TIFFからNSDataに変換され、再び元に戻りますか? – timthetoolman
私はそれが重要かどうかはわかりませんが、あなたが+初期化でバリュートランスを登録しましたか?試すだけの価値があります。プロパティーに独自のバリュートランスを割り当てず、代わりに標準のトランスフォーマーを使用するとどうなりますか?また、NSImageがNSCodingプロトコルを実装しているので動作するはずです。 –
** timthetoolman:**ご意見ありがとうございます。私は変換がコードで動作することを確認しましたが、コアデータの外でイメージトランスフォーマーの別のインスタンスを使用することで明示的にはできません。それはあなたが意味することですか?とにかく、上記の質問の終わりに、イメージトランスフォーマのチェックに使用されたコードを追加しました。ありがとう。 –