0

在我的代码中,我将图像存储到我的核心数据模型中(工作正常)。如果我将视图设置为具有 NSImageView 并将其数据绑定到控制器键:选择和 modelKeyPath:myImagePath,它就可以工作。它将显示所选行的每个图像。

然后我在我的 NSTableView 中创建一个新列并将一个图像单元格拖到该列上。但是,我无法让我的核心数据绑定让图像显示在单元格中。我已经尝试绑定值和数据,但没有运气。

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

非常感谢。

(我的背景:新的 Cocoa 开发人员,最近浏览了整个 Hillegass 的书。)

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 回答