【问题标题】:Core Data Image Won't Load Into NSTableView Image Cell核心数据图像不会加载到 NSTableView 图像单元中
【发布时间】:2010-05-19 01:43:31
【问题描述】:

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

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

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

非常感谢。

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

【问题讨论】:

    标签: cocoa nstableview nstablecolumn nsimagecell


    【解决方案1】:

    我不确定是什么导致了您的问题,但有一种简单的方法可以找出答案。将 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 或您想要的任何其他方法。

    【讨论】:

    • 谢谢,这成功了!唯一的问题是我通过将数据绑定到 NSTableColumn 得到了一个不推荐使用的警告。但是您使用 NSKeyedArchiver 保存图像数据并使用此转换器检索它的策略是成功的。
    • 我记得其中一个绑定已被弃用,因此请改用另一个绑定...它是值绑定吗?您也可以将它与该绑定一起使用,如果不只是根据需要修改转换器以返回任何必要的对象。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 2021-10-21
      • 2019-01-17
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多