質問

私は非常に簡単なことであると思われることに固執しています。コアデータエンティティストア /ディスプレイ(バインディングを介して)を使用して、変換可能な属性として割り当てられた画像を持っています。

スタックの多くの関連投稿を読んだことがあります(例を参照 ここここ)、しかし、サンプルコードを開発し、他の記事を調査した後、まだ問題があります(例: こちらをご覧ください としても ここ)。これは私の以前のものに関連しています 質問, 、私はまだ解決していません。

問題を示すために、単純なドキュメントベースのコアデータアプリを作成しました。コアデータ管理オブジェクトは「TheEntity」と呼ばれ、属性「TheImageatt」と呼ばれます。コアデータで定義されているエンティティを以下に示します(ImageValueTransFormerはnsvalueTransformerです):
enter image description here

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」のヘッダーおよび実装ファイルです。スタックや他の場所でのこの例の多くの例(TIFF担当者は任意です)。

//  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

値変圧器は、MyDocument.mにITのインスタンスを割り当てることで初期化 /登録できますが、最終的には、トランスヘッダーがTheEntityヘッダーにインポートされる限り、それほど重要ではありません(上記参照)。私はこれを実験しましたが、以下のエラーを削除しません。参照のために、あります 以前の議論かどうかについての議論 バリュートランスを登録する必要があります(コーンパフとブライアンウェブスターによるコメントを参照)。

手元の問題に戻ると、Appleの良いコード例は ここ バリュートランスの代替初期化を示す、私もそのセットアップを試みました。

これを実行するには、テスト画像をロードしてmyDocument.mの変換可能属性に割り当てる方法があります(nStableの選択したエンティティインスタンスから):

- (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
}

コードが壊れる場所でゼロイングイン、以下の行:

[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は正常に正常に入力されます(したがって、バインディングとアレイコントローラーは問題ないように見えます)が、もちろん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]; 

これに何が欠けていますか?

役に立ちましたか?

解決

上記のエラー、つまり、

Cannot create BOOL from object ...

私が以前に書き込もうとしていたカスタムビューではなく、画像ウェルまたは画像セル(nsimageViewのサブクラス)を使用する場合は発生しません。

したがって、今のところ、カスタムバリュートランスではなく、デフォルトの値トランスを使用しています。これは実行可能なソリューションですが、学問的に言えば、コアデータ属性(コア日付モデルで変換可能として定義される)にバインディングするときにデフォルトのカスタムビューがエラーにつながった理由を知っておくといいでしょう。

これをもう少し掘り下げると、画像はnsimageViewからよく継承されます。したがって、少なくとも1つの違いは、「編集可能な」プロパティに関しては異なることです(イメージウェルは編集可能であり、drag-n-dropでうまく機能します)。したがって、これら2つを調整するために、私はカスタムビューを編集可能に設定し、これが問題を解決するかもしれないと考えています。

theImageView = [[NSImageView alloc] init];
[theImageView setEditable:YES];

しかし、それは何か他のものでなければなりません、これは上記のエラーを解決しません。少なくとも今のところ、私は実行可能な解決策を持っています。他の人がこれに遭遇した場合、これらのメモが役立つことを願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top