iOS - UIImage imageNamed:在设备上返回null

时间:2013-04-07 18:33:11

标签: ios ios6 uiimage

[UIImage imageNamed:filename]

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

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

但没有任何事情可以帮助我。

案例很简单:我有4个文件名:Bar@2x~ipad.png,Bar @ 2x~iphone.png,Bar~ipad.png,Bar~iphone.png。 所有这些都在项目中,目标复选框已选中。

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

这行代码让我对设备无效,我真的不知道我现在做错了什么。

8 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

我的案例中的解决方案是将扩展名添加到文件名中。

[UIImage imageNamed:@"Bar.png"]

答案 2 :(得分:1)

彻底清理你的构建并重做它:

  1. 从设备中删除应用
  2. 选项 - 清除Xcode中的整个构建目录(⌘-Shift-K)
  3. 退出xcode
  4. delete~ / Library / Developer / Xcode / DerivedData
  5. 重启xcode,构建并运行

答案 3 :(得分:1)

这恰好发生在我身上,并且发现非常艰难:我有一张图片,其中nil只是在设备上

logoWhite.png

我的代码:

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

经过一段时间的调试后,我注意到图片的名称以大写字母开头。显然,这在具有忽略案例文件系统的OSX上无关紧要。 iOs文件系统不是,因此图像在模拟器上工作但在设备上没有。

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

答案 4 :(得分: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更多类型的视频文件,因为它支持更多编解码器。

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

答案 5 :(得分:0)

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

以下是我的调查结果,以及解决问题的方法。

在我的iPhone应用程序中,我下载了一个图像并将其存储在本地,这一直都很好。

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

虽然有三个注释:

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

    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模拟器上正常工作),但我发现以下一行做了< / em>工作还可以:

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

    因此,您似乎应该使用此功能来加载不属于应用程序包的图像。

答案 6 :(得分:0)

我也遇到同样的问题:XCode - Build Phases - Copy Bundle Resources - {查看图片是否可用} - add{image} - clean - delete app - Run

答案 7 :(得分:0)

我想为所有上述解决方案添加一个更重要的观点

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

如果开发人员与资源和目标的混乱链接出现错误,则会出错。

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

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

enter image description here