核心数据图像无法加载到NSTableView图像单元格中

时间:2010-05-19 01:43:31

标签: cocoa nstableview nstablecolumn nsimagecell

在我的代码中,我将图像存储到我的Core Data模型中(工作正常)。如果我将视图设置为具有NSImageView并将其数据绑定到Controller Key:selection和modelKeyPath:myImagePath,则它可以正常工作。它将显示所选行的每个图像。

然后我在NSTableView中创建一个新列,并将一个图像单元格拖到列上。但是,我无法获取我的Core Data绑定以使图像显示在单元格中。我试过绑定值和数据,但没有运气。

由于我确定图像存储正确,我在绑定中做错了什么以防止图像出现在表格单元格中?

非常感谢。

(我的背景:最近通过整本Hillegass书的新Cocoa开发人员。)

2 个答案:

答案 0 :(得分: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或您想要的任何其他方法。

答案 1 :(得分:0)

如果有人对使用Xcode 6的建议技术有疑问。我使用基于文档的应用程序创建了一个Swift项目。使用ImageWell控件(NSImageView),绑定可以直接工作而无需变换器。 但是一个细节,让你绑定视图本身的数据绑定,而不是它下面的ImageCell对象。