UIImage imageNamed返回nil

时间:2012-06-12 14:16:17

标签: ios xcode uiimage imagenamed

我是iOS和Xcode的新手。

我尝试用

加载图片
[UIImage imageNamed:@"imageName.png/jpg and so on"];

但它只返回nil。图像应该在我的项目包中,考虑到我可以从InterfaceBuilder中的拖放菜单中选择它,并通过“添加文件到”项目名“...”菜单将其添加到Xcode。

使用.png或.jpg图像没有区别,结果保持不变:它们通过IB工作,但如果我尝试自己运行imageNamed方法则不行。

19 个答案:

答案 0 :(得分:85)

只有几个原因可以使用imageNamed来恢复图像:

  • 图片不在您的包中。确保图像实际上在您的项目中。确保通过单击文件并选择它所属的目标来检查目标。

  • 您的图片名称拼写不正确或扩展名有问题。

  • 您使用的是视网膜显示器,但没有@ 2x图像。尝试将模拟器更改为视网膜,看看它是否显示出来。

  • 如果您使用的是资产目录,请确保在属性检查器中选择了正确的设备。

一些提示:

如果您正在使用模拟器进行测试,请从模拟器中删除应用程序并清理项目,然后重新运行。如果它仍然出现,它应该显示在你的手机上(如果它不是它可能是文件名或@ 2x版本的问题)。

如果您在手机上测试并且没有显示,请确保您使用的是相同版本的模拟器(如果您有iPhone 4 / 4s,请务必使用带有视网膜的4 / 4s模拟器)

根据这篇文章的最后一件事:JPG image doesn't load with UIImage imageNamed使用imageNamed的某些JPG类型存在一些问题,没有扩展名。 IMO,你应该使用PNG,因为iOS会为你压缩,除非你只需要使用JPG。

答案 1 :(得分:17)

Re Mike Weller的评论。复选框是....

enter image description here

答案 2 :(得分:9)

我刚刚在磁盘“file.jpg”上命名的jpg文件存在此问题

我试图加载没有扩展名,只是@“file”。虽然这适用于pngs,但它不适用于jpg。一旦我使用@“file.jpg”,它就有用了!

答案 3 :(得分:5)

如果您验证了上述所有内容并且发现您的UIImage(名为:“myImage”)从正在构建的动态框架内的代码返回nil ,那么您必须更改代码到:

UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)

这应该正确地从CXAssets中检索资产。

答案 4 :(得分:2)

快速5

如果在动态框架中获得UIImage nil,则应使用捆绑标识符设置图像。

您可以像这样为Bundle创建扩展名;

  • 创建扩展名;

    extension Bundle { public static let myFramework = Bundle(identifier: "com.myFramework.bundle") }

  • 然后像这样使用;

    UIImage(named: "myImageName", in: Bundle.myFramework, compatibleWith: nil)

您可以这样使用

  • UIImage(named: "myImageName", in: Bundle(for: type(of: self)), compatibleWith: nil)

我认为第一个对于可读代码很有用。

享受

答案 5 :(得分:1)

尝试使用UIImage(contentsOfFile:)代替imageNamed。下载的图像对我有用。

答案 6 :(得分:1)

检查文件末尾没有空格。 像name @2x.png这样的名称将无法加载,但name@2x.png很好

答案 7 :(得分:1)

我有一个类似的问题,最后清理修复它:图像显示在模拟器中,但在iPhone上运行应用程序时ID没有出现。
我做了什么: 1)从iPhone删除了应用程序 2)执行产品/清洁 之后,错误被修复,图像出现了!

答案 8 :(得分:1)

尝试重新导出图片。

我有一个类似的问题,UIImage imageNamed返回零,这些答案都没有解决我的问题。

我发现png文件实际上有问题。我在GIMP图像编辑器中打开文件,将其保存为新文件,再次将其导出为png,然后神奇地开始工作。

我根本没有更改代码中的任何内容,因此实际的图像文件肯定有问题。

答案 9 :(得分:1)

我遇到了同样的问题:@“photo.jpg”导致了'nil'UIImage。 更改为“实际”文件规范,@“photo.JPG”工作正常! 我没有意识到那里有区分大小写!非常不直观。

答案 10 :(得分:0)

确保您拥有.xcassets文件中正在使用的DEVICE的图像。标记为iPad的图像不会显示在手机(或模拟手机)上。

答案 11 :(得分:0)

尝试

[UIImage imageNamed:@"imageName.png"];

代替(带扩展名)

答案 12 :(得分:0)

除了@Inturbidus的回答: 对于那些来到这里工作应用程序扩展的人:

您正在使用的图片应属于两个目标 - 托管的应用和扩展程序。

在其他情况下,您始终会nil尝试从扩展程序代码中访问它。

答案 13 :(得分:0)

对于Xcode 6.4,单击Images.xcassets并检查您调用的每个图像是否有条目。您可以右键单击图像,然后选择"在Finder中显示"检查图像是否添加了正确的图像。

答案 14 :(得分:0)

确保图像的“属性检查器”名称字段与您正在使用的名称完全匹配。在我的情况下,图像是文件夹的一部分,因此图像名称是"文件夹/名称"。使用这个长名称解决了这个问题。 XCode 7.3.1

答案 15 :(得分:0)

就我而言,使用带有重音字符的名字被证明是个糟糕的主意。我将Astéroïdes改为Asteroids并且工作正常。

答案 16 :(得分:0)

图像是在模拟器上工作,而不是在设备上工作吗?

如果是这样,在这种情况下, 始终 与名称的情况有关。该设备需要精确的外壳,如果我没记错的话,模拟器就不那么挑剔了。

e.g。对于名为 image.png

的图片
[UIImage imageNamed:@"Image"];

可以在模拟器上工作但不能在设备上工作......

答案 17 :(得分:0)

就我而言,问题在于资产目录中的图像名称。 例如,如果您的图像名称为“ TEst”,并且将名称更改为“ Test”,则更改将不会被索引。如果您的队友将通过此更改进行提交,则其资产目录中的图像将具有以前的名称“ TEst”。 抓住这种情况的机会很小,但是有可能。

答案 18 :(得分:0)

我的项目中有多个.xcassets,其中2个具有重复的图像名称。因此就我而言,它不是加载图像。