53

我对 iOS 和 Xcode 很陌生。

我试图用

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

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

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

4

20 回答 20

96

使用 imageNamed 时图像返回 nil 的原因只有几个:

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

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

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

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

一些技巧:

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

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

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

于 2012-06-12T16:51:57.020 回答
18

重新迈克韦勒的评论。复选框是....

在此处输入图像描述

于 2012-06-12T14:27:06.023 回答
16

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

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

于 2013-02-06T20:04:14.523 回答
15

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

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

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

于 2017-03-23T21:58:32.887 回答
10

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

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

于 2014-09-11T19:14:32.170 回答
4

斯威夫特 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)

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

于 2019-06-21T06:38:16.820 回答
2

尝试重新导出您的图像。

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

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

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

于 2013-08-26T05:26:46.153 回答
1

尝试

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

相反(带有扩展名)

于 2012-06-12T14:18:46.197 回答
1

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

于 2013-05-14T03:37:05.737 回答
1

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

于 2013-11-01T17:07:35.850 回答
1

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

于 2015-07-30T02:13:19.720 回答
1

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

于 2016-03-04T13:13:38.927 回答
0

图像是否可以在模拟器上工作,但不能在设备上工作?

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

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

[UIImage imageNamed:@"Image"];

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

于 2012-06-12T14:58:24.090 回答
0

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

于 2014-08-28T23:03:00.950 回答
0

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

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

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

于 2015-09-02T09:36:46.450 回答
0

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

于 2015-09-11T18:47:32.387 回答
0

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

于 2016-09-06T21:19:12.687 回答
0

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

于 2017-04-24T13:22:51.607 回答
0

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

于 2020-01-24T12:25:02.847 回答
0

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

于 2020-02-10T05:47:04.147 回答