【问题标题】:NSImage readFromData problemNSImage readFromData 问题
【发布时间】:2009-12-26 03:25:38
【问题描述】:

我正在尝试制作一个简单的基于文档的可可应用程序,它可以在 pdf 文件中保存和加载图像。

对于保存部分,我正在使用

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    return [imageView dataWithPDFInsideRect:[imageView bounds]];
}

这行得通,图像可以保存为 PDF 文件。

对于负载部分,我正在使用

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    NSData *dataFromFile = [data retain];
    NSImage *image = [[NSImage alloc] initWithData:dataFromFile];
    NSLog(@"Load image as: %@", image);
    // Do something about the image
    if (outError != NULL) {
        NSLog(@"Error when loading data ...");
        *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
        return NO;
    }
    return YES;
}

这总是失败,但是 NSLog 打印出图像不是 NULL:

Load image as: NSImage 0x16ead890 Size={1023, 601} Reps=(NSPDFImageRep 0x16e97480 Size={1023, 601} ColorSpace=NSCalibrateRGBColorSpace BPS=0 Pixels=1023x601 Alpha=NO)

Error when loading data ...

我不太明白 readFromData 中发生了什么问题导致 outError != NULL 在这里。

【问题讨论】:

  • 找出错误所在是很好的第一步。
  • 问题解决了。错误处理不正确。但还有一个问题是:我试图从加载的图像中更新一个视图(属于另一个类),在调用 readFromData: 时视图尚未初始化,所以我将消息发送到一个 nil 对象。因此,我在类中声明了一个新的 NSImage 属性,以保持从 readFromData: 加载图像并更新 windowControllerDidLoadNib: 中的视图。有用。有更简单的方法吗?

标签: cocoa macos nsimage nsdocument


【解决方案1】:

您的图像正在成功创建。

您不太了解错误参数的工作原理。您的 -readFromData:ofType:error: 方法被传递一个指向指针的指针,供您使用 if 您无法从 NSData 实例创建图像。

您应该阅读有关 NSError 的文档以了解如何创建和使用 NSError 实例。

【讨论】:

【解决方案2】:

您正在从调用 -readFromData:ofType:error: 的任何内容传递 outError。更重要的是,outError 是一个指向指针的指针。你应该检查的是:

if (outError != nil && *outError != nil) {...

【讨论】:

  • 即使删除了整个 "if (outError != NULL)" 部分,它也不起作用。之前保存的 pdf 图片加载为空图片。
【解决方案3】:

如果您在阅读文档时遇到错误,您可以设置 outError。它不会告诉您您的代码是否失败。这是您告诉呼叫者出了什么问题的方式。 [NSImage initWithData:] 如果失败则返回 nil,所以你需要更改:

if (outError != NULL) {

到:

if (image == NULL) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多