【问题标题】:How do I add a NSError check with initWithContentsOfFile when looking for an image?查找图像时如何使用 initWithContentsOfFile 添加 NSError 检查?
【发布时间】:2012-09-16 12:33:05
【问题描述】:

在我的应用程序中,用户可以将图像保存到他们的文档目录中。在启动时,我抓取图像,添加边框,然后像这样将其放入 UIImageview 中......

NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
        NSString *docDirectory = [sysPaths objectAtIndex:0];
        NSString *filePath = [NSString stringWithFormat:@"%@/ImageOne.jpg", docDirectory];
        UIImage *unborderedImage  = [[[UIImage alloc] initWithContentsOfFile:filePath] autorelease];

        //image found....add border
        UIImage *imageWithBorder = [self addBorderToImage:unborderedImage];
        imageOneView.image = imageWithBorder;

理想情况下,我喜欢在添加边框之前先检查图像是否存在。如果没有,请加载“图像不可用”占位符。像这样的:

NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
        NSString *docDirectory = [sysPaths objectAtIndex:0];
        NSString *filePath = [NSString stringWithFormat:@"%@/ImageOne.jpg", docDirectory];
        UIImage *unborderedImage  = [[[UIImage alloc] initWithContentsOfFile:filePath] autorelease];

NSError * error;

    if (error != nil) {
        //image found....add border
        UIImage *imageWithBorder = [self addBorderToImage:unborderedImage];
        imageOneView.image = imageWithBorder;
    } else
        //no image saved
        [imageOneView setImage:[UIImage imageNamed:@"photoNotAvailable.png"]];
    }

当然,这是行不通的。如果找不到“ImageOne.jpg”,我似乎无法弄清楚如何处理。

【问题讨论】:

  • 不要做[NSString stringWithFormat:@"%@/ImageOne.jpg", docDirectory]之类的事情; NSString 提供路径处理例程是有原因的
  • 很高兴指出不该做什么,但没有提供正确的方法。
  • 我告诉过你NSString 有路径处理例程。查找它们并不难。

标签: nserror initwithcontentsoffile


【解决方案1】:

您在这里的错误处理没有做任何事情并且被误导了。您需要做的只是检查unborderedImage 是否为零。

【讨论】:

  • 我知道它不起作用,因此发帖。我输入了“if (error != nil)”,这样你就可以看到我想要完成的图像是否保存。我不想检查“unborderedImage”是否为 nil,因为这意味着尝试获取不存在的图像。那很浪费。我只想获取图像,如果它在那里,而不是获取它并返回空。我想出了一个更好的解决方案。张贴在顶部。
  • 检查unborderedImage 不会做任何额外的工作。您似乎缺少对基本原理的掌握。请阅读它们,包括 Cocoa 中的错误处理。
【解决方案2】:

事实证明,我需要在应用程序的其他位置对图像执行其他操作。这也取决于用户是否保存了图像。因此,在我的用户可以保存图像的方法中,我发送了一个图像已更改的 NSNotification。然后在我的 MainView 上查找通知并关闭它。

保存时:

[collectionOneUserDefinedDefaults setObject:@"image added" forKey:@"collectionOneImageAdded"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"collectionOneImageChanged" object:self];

然后在我的 MainView 中查找通知:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateCollectionOneImage) name:@"collectionOneImageChanged" object:nil];

- (void)updateCollectionOneImage {

    //check if an image was ever saved, if so, replace the noPhotoAvailalble placeholder
    NSUserDefaults *collectionOneUserDefinedDefaults = [NSUserDefaults standardUserDefaults];
    NSString *collectionOneImageTextString = [collectionOneUserDefinedDefaults stringForKey:@"collectionOneImageAdded"];

    if (collectionOneImageTextString == nil || [collectionOneImageTextString isEqualToString:@""]) {
        [collectionOneImage setImage:[UIImage imageNamed:@"photoNotAvailable.png"]];
    }
    else {
        //pull in collection one image from the Documents folder
        NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
        NSString *docDirectory = [sysPaths objectAtIndex:0];
        NSString *filePath = [NSString stringWithFormat:@"%@/CollectionOneImage.jpg", docDirectory];
        UIImage *unborderedImage  = [[[UIImage alloc] initWithContentsOfFile:filePath] autorelease];
        //image found....add border
        UIImage *imageWithBorder = [self addBorderToImage:unborderedImage];
        collectionOneImage.image = imageWithBorder;
    }
}

完美运行。它反过来建立在错误处理中。如果用户保存和图像,它会被加载。如果没有,则加载占位符图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多