繁体   English   中英

UIImage imageNamed 返回 nil

[英]UIImage imageNamed returns nil

我对 iOS 和 Xcode 很陌生。

我试图加载一个图像

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

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

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

图像返回 nil 并带有 imageNamed 的原因只有几个:

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

  • 您的图像名称拼写错误或扩展名有问题。

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

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

一些技巧:

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

如果您在手机上进行测试但它没有出现,请确保您使用的是相同版本的模拟器(如果您有 iPhone 4/4s,请确保使用带有视网膜的 4/4s 模拟器)。

根据这篇文章的最后一件事: JPG 图像不加载 UIImage imageNamed某些 JPG 类型使用 imageNamed 并且没有扩展名存在一些问题。 IMO,无论如何你都应该使用 PNG,因为 iOS 会为你压缩它们,除非你只需要使用 JPG。

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

在此处输入图片说明

就我而言,PNG 格式不正确。

出于某种原因,Xcode 预览显示正确,但是当我尝试使用 UIImage 加载它时,它返回 nil。

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

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

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

我刚刚在磁盘“file.jpg”上命名的 jpg 文件遇到了这个问题

我试图在没有扩展名的情况下加载,只是@"file"。 虽然这适用于 png,但不适用于 jpg。 一旦我使用@"file.jpg",它就起作用了!

斯威夫特 5

如果你在动态框架中得到 UIImage nil,你应该使用 bundle identifier 设置图像。

您可以像这样创建 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)

我认为第一个更有用,因为它比第二个更具可读性。

尝试重新导出您的图像。

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

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

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

尝试

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

相反(带扩展名)

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

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

尝试使用UIImage(contentsOfFile:)而不是imageNamed 它对我下载的图像有用。

检查文件末尾是否有空格。 name @2x.png这样的name @2x.png会加载失败,但是name@2x.png

图像在模拟器上是否有效,但在设备上无效?

如果是这样,在这种情况下,它总是与名称的大小写有关。 该设备需要精确的大小写,如果我没记错的话,模拟器并没有那么挑剔。

例如,对于名为image.png的图像

[UIImage imageNamed:@"Image"];

可以在模拟器上运行,但不能在设备上运行...

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

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

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

在其他情况下,您总是会在尝试从扩展程序代码中访问它时获得nil

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

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

就我而言,使用带有重音字符的名称被证明是一个糟糕的主意。 我将 Astéroïdes 改为 Asteroids,效果很好。

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

我的项目中有多个 .xcassets,其中 2 个有重复的图像名称。 所以在我的情况下它没有加载图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM