2010-05-19 57 views
0

在我的代码中,我将图像存储到我的核心数据模型(工作正常)。如果我设置我的视图有一个NSImageView并将其数据绑定到控制器键:选择和modelKeyPath:myImagePath,它的工作原理。它将显示选定行的每个图像。核心数据图像不会加载到NSTableView图像单元

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

由于我确信图像存储正确,我在做什么我的绑定错误,以防止图像显示在表格单元格?

非常感谢。

(我的背景:新的可可开发商谁最近在整个Hillegass书了)

回答

2

我不知道发生了什么导致你的问题,但有一个简单的方法来找出。将一个NSValueTransformer连接到绑定。然后在那个转换器中,你可以记录一些东西,看看你是否传递了一个零值,或者你可以把你的数据值转换成一个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或其他所需的方法代替它。

+0

谢谢,这工作!唯一的问题是,我通过将数据绑定到NSTableColumn来获得不推荐的警告。但是,使用NSKeyedArchiver保存图像数据并使用该变换器检索图像数据的策略是成功的。 – jcady 2010-05-19 16:41:12

+0

我记得有关绑定的一个被弃用,所以使用其他绑定,而不是...是它的价值绑定?你也可以使用这个绑定,如果不是只是根据需要修改变换器来返回任何需要的对象。 – regulus6633 2010-05-19 17:30:44

0

如果有人对使用Xcode 6的建议技术存在问题,我使用基于文档的应用程序创建了一个Swift项目。使用ImageWell控件(NSImageView),绑定可以直接使用,而不需要变压器。 虽然有一个细节,但是您将绑定在视图本身的数据绑定上,而不是在它下面的ImageCell对象上。