12
[UIImage imageNamed:filename]

此方法仅在设备上返回 null。

我知道这是已知问题,通常是因为模拟器不区分大小写。我已经尝试过这里提出的解决方案:UIImage imageNamed 返回 nil

但对我来说没有任何结果。

案例很简单:我有4个文件,分别命名为:Bar@2x~ipad.png、Bar@2x~iphone.png、Bar~ipad.png、Bar~iphone.png。他们都在项目中,选中了目标复选框。

NSLog(@"%@",[UIImage imageNamed:@"Bar"]);

那行代码给了我设备的 null ,我真的不知道我现在做错了什么。

4

8 回答 8

5

我最近也遇到了这样的问题。

在使用文件名和路径之后,有时它会在您清理和重建项目时有所帮助。

于 2013-04-07T18:54:15.113 回答
4

我最近发现自己处于同样的境地。

在我的情况下,解决方案是将扩展名添加到文件名中。

[UIImage imageNamed:@"Bar.png"]
于 2013-04-07T18:37:23.610 回答
2

彻底清理您的构建并重做:

  1. 从设备中删除应用程序
  2. 选项-清理 Xcode 中的整个构建目录 (⌘-Shift-K)
  3. 退出 xcode
  4. 删除 ~/Library/Developer/Xcode/DerivedData
  5. 重新启动 xcode,构建并运行
于 2013-04-07T19:00:49.840 回答
1

这只是发生在我身上,发现非常困难:我有一张图像,它只是在设备上为零

logoWhite.png

我的代码:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"LogoWhite"] forBarMetrics:UIBarMetricsDefault];

经过一段时间的调试,我注意到图像的名称以大写字母开头。显然,这在带有忽略大小写文件系统的 OSX 上并不重要。iOs 文件系统不是,所以图像在模拟器上工作,但在设备上不工作。

我敢打赌,所有关于清理派生数据和重建的解决方案都随机以重命名图像结束,这也可以解决问题。只是在这里发布以供将来参考:)

于 2013-11-22T22:17:47.593 回答
0

我遇到了这个问题,只是修复了它。我列出了下面的解决方案作为参考。

我有几个图像,并使用 [UIImage imageNamed:filePath] 来显示它们。除了模拟器/设备上的 1 个图像外,所有图像都显示良好,但所有图像都可以在 OS X 上看到。对于该图像,[UIImage imageNamed] 始终返回 null。

经过几分钟的调查,我发现图像导致问题的文件大小很大:4.1M。其他的都在800kb左右。它们的尺寸几乎相同。

然后我尝试在图像编辑器中打开它,然后重新保存它。在此之后,大小下降到 800k。问题解决了。

我猜的原因,

  1. [UIImage imageNamed:filePath] 有最大文件大小限制吗?(可能性小,但需要查看官方文档)

  2. 图像本身有一些错误。但是 OS X 比 iOS 有更好的容忍度。所以 iOS 无法读取并返回 null。这个问题就像 OS X 可以播放比 iOS 更多类型的视频文件,因为它支持更多的编解码器。

因此,如果您将来遇到此问题,请花几秒钟查看文件大小。希望有所帮助。

于 2013-07-29T07:57:55.473 回答
0

这是一个奇怪的问题,直到本周我才看到。

以下是我的发现,以及解决您的问题的方法。

在我的 iPhone 应用程序中,我下载了一张图片并将其存储在本地,这一直运行良好。

但是现在当我运行相同的代码时,它突然无法UIImage使用该imageNamed函数创建它,现在它返回 nil。

三个注意事项:

  1. 这个确切的代码之前确实有效,使用相同的源代码和 .png 图像文件。我不确定我的 XCode 6.x 或 iOS 8.x 副本是否在此期间悄悄地更新了自己。
  2. 代码在 iPhone 模拟器上继续正常工作(使用相同的图像文件)。它只是在真实设备上不起作用。
  3. 看看下面的代码。失败时UIImage:imageNamed,我运行了一些代码来检查文件是否真的存在......确实存在。然后我从文件中加载二进制数据NSData:contentsAtPath(这也证明文件存在并且在正确的文件夹中),然后创建了一个UIImage,它工作正常。

咦?!

UIImage* img = [UIImage imageNamed:backgroundImageFilename];
if (img != nil)
{
    //  The image loaded fine (this always worked before).  Job done.
    //  We'll set our UIImageView "imgBackgroundView" to contain this image.
    self.imgBackgroundView.image = img;
}
else
{
    //  We were unable to load the image file for some reason.
    //  Let's investigate why.

    //  First, I checked whether the image was actually on the device, and this returned TRUE...
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:backgroundImageFilename];
    if (fileExists)
        NSLog(@"Image file does exist.");
    else
        NSLog(@"Image file does not exist.");


    //  Next, I attempted to just load the bytes in the file, and amazingly, this also worked fine...
    NSData *data = [[NSFileManager defaultManager] contentsAtPath:backgroundImageFilename];
    if (data != nil)
    {
        //  ..and then I COULD actually create a UIImage out of it.
        img = [UIImage imageWithData:data];
        if (img != nil)
        {
            //  We have managed to load the .png file, and can now
            //  set our UIImageView "imgBackgroundView" to contain this image.
            self.imgBackgroundView.image = img;
        }
    }
}

正如我所说,这段代码确实为这个问题提供了一个解决方法,但它突然开始发生是非常奇怪的。

而且,我应该说,我确实尝试了这个线程中的其他建议,清理项目,删除 DerivedData,从设备中完全删除应用程序等等,但它们没有任何区别。

我很想知道是否有其他人遇到此问题,并发现我的代码示例适用于他们。

更新

我是个白痴。

我不确定该UIImage:imageNamed功能是否发生了变化(如果是,为什么它在 iPhone 8.1 Simulator 上仍然可以正常工作),但我发现以下一行确实可以正常工作:

UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename];

所以看起来你应该使用这个函数来加载不属于你的应用程序包的图像。

于 2015-02-26T21:08:16.013 回答
0

我也有同样的问题:XCode - Build Phases - Copy Bundle Resources -{see image is available or not} - add{image} - clean - delete app - Run

于 2015-07-02T09:54:36.947 回答
0

我想在上述所有解决方案中再补充一点

确保将图像资源添加到正确的目标

如果开发人员错误地与资源和目标链接,则会出现条件。

如果您有多个目标,请仔细检查资源是否设置为正确的目标。

在多个目标之间的资源链接的情况下附加屏幕截图示例。

在此处输入图像描述

于 2015-10-05T04:55:46.723 回答