0

私のコードでは、画像を Core Data モデルに保存しています (正常に動作します)。NSImageView を持つようにビューを設定し、そのデータを Controller Key: selection と modelKeyPath: myImagePath にバインドすると、機能します。選択した行の各画像が表示されます。

次に、NSTableView に新しい列を作成し、画像セルを列にドラッグします。ただし、Core Data バインディングで画像をセルに表示することはできません。値とデータの両方をバインドしようとしましたが、うまくいきません。

画像が適切に保存されていると確信しているため、バインディングで画像がテーブル セルに表示されないようにするために間違っていることは何ですか?

本当にありがとう。

(私のバックグラウンド: 最近、Hillegas の本全体を読んだ新しい Cocoa 開発者です。)

4

2 に答える 2

2

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

于 2010-05-19T13:17:50.523 に答える
0

Xcode 6 で提案された手法に問題がある場合は、Document ベースのアプリを使用して Swift プロジェクトを作成しました。ImageWell コントロール (NSImageView) を使用すると、バインディングはトランスフォーマーを必要とせずに直接機能します。ただし、詳細は、その下の ImageCell オブジェクトではなく、ビュー自体のデータ バインディングにバインドします。

于 2015-02-12T01:19:19.423 に答える