UIImage imageNamed 返回 nil

Posted

技术标签:

【中文标题】UIImage imageNamed 返回 nil【英文标题】:UIImage imageNamed returns nil 【发布时间】:2012-06-12 14:16:17 【问题描述】:

我对 ios 和 Xcode 还是很陌生。

我尝试用

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

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

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

【问题讨论】:

选择文件,然后打开右侧的文件检查器窗格。确保您的目标旁边有一个复选标记。 你试过清理你的项目了吗? Shift-Apple-K 是命令。这似乎是我丢失图像的主要原因。 尝试清洁是我的第一个想法。在文件检查器中找不到任何复选标记,它到底应该在哪里? 啊,现在我知道 Mike Weller 的意思了:是的,我的项目旁边有一个复选标记 你能编辑问题并输入你用来获取图像的确切代码吗? 【参考方案1】:

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

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

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

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

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

一些提示:

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

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

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

【讨论】:

对不起,我的回答迟了 - 我病了,今天刚回去工作。我尝试重写和重新编译代码,突然它起作用了!我仍然不确定它为什么会/之前没有,但非常感谢所有帮助! 我不得不删除该应用程序,但仅此一项并不能解决问题。做产品 -> 清洁后,我能够看到正确的图像 你是 100% 正确的!我遇到了同样的问题,这是因为我没有 @2x 文件。 我的捆绑包中没有任何.jpg 文件,因为...曾经?出于测试目的复制了一个,丢失了半个小时,想知道为什么我的图像没有加载。投票支持提出.jpg 扩展问题 - 尽管我自己想通了。 iOS 7 的 JPG 图像似乎存在问题,而 iOS 8 则没有,所以它发生在我身上并通过将图像转换为 PNG 来修复它【参考方案2】:

关于 Mike Weller 的评论。复选框是....

【讨论】:

非常感谢,重读评论后发现自己。虽然它已经过检查,但遗憾的是并没有改变行为。【参考方案3】:

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

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

【讨论】:

你拯救了我的一天!我通过将图像文件扩展名从 .psd 更改为 .png 并希望它可以作为正确的 png 文件工作而遇到了类似的情况。不知何故 Xcode 让我可以正确预览图像。那是邪恶的 刚刚遇到同样的问题。原始文件是 JPEG,它被重新保存为 PNG。在模拟器上它工作正常,但在实际设备上,图像总是返回 nil。 谢谢!!这些方面的东西对我来说是个问题。对于我的情况,我不会说格式错误,因为该图像确实是 PNG 并且在其他任何地方(原生 android、跨平台桌面、桌面和移动网络,包括 iOS Safari)都没有问题,但 UIImage 一直返回 nil。我在 Photoshop 中打开它,然后将其导出为 PNG,覆盖相关文件,现在它可以工作了。简直荒谬。【参考方案4】:

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

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

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

【讨论】:

这在处理动态框架时节省了我的时间。我添加了一个类方法来简化包检索:+(NSBundle*)currentBundle static dispatch_once_t predicate = 0; static NSBundle *myBundle = nil; dispatch_once(&predicate, ^ myBundle = [NSBundle bundleWithIdentifier:@"yourbundle.identifier"]; ); return myBundle; 是否可以从 Interface Builder 中加载这样的图像? 在 Xcode 中使用在另一个项目中编译的框架时,这是从框架中调用时加载图像的唯一方法。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

尝试重新导出您的图像。

我遇到了类似的问题,UIImage imageNamed 返回 nil,这些答案都没有解决我的问题。

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

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

【讨论】:

我一直遇到相反的问题,如果我用 GIMP 导出它就不起作用。但如果我用其他东西导出它,我可以让它工作。【参考方案8】:

试试

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

改为(带有扩展名)

【讨论】:

@Mike Weller : 在 iOS 4 之前,您必须指定文件扩展名。 为 iMx 辩护:当我第一次发布问题时,我没有提到尝试这样做,我认为这很明显;) @arnesomborn 有一些可能的原因:link【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

图像在模拟器上工作但在设备上不工作?

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

例如对于名为 image.png

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

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

【讨论】:

这不是因为模拟器不那么模糊,而是因为默认情况下 HFS+(OS X 文件系统)不区分大小写。这意味着它将aaAAaAAa 视为同一个文件。您可以使用 HFS+ 格式化新的 HD 并决定使其区分大小写(磁盘工具为您提供选择),但 Mac 附带一个从不区分大小写的预格式化 HD。许多Mac程序员不注意,然后他们的应用程序将在所有者重新格式化其HD以区分大小写的Mac上崩溃;如果您从头开始重新安装系统,这是可能的。【参考方案14】:

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

【讨论】:

【参考方案15】:

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

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

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

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

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

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

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

【讨论】:

以上是关于UIImage imageNamed 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

UIImage imageNamed 在应用程序 A 中给出 nil,但在应用程序 B、C、D 中不给出

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

仅使用Kingfisher库获取UIImage

UIImage返回nil但存在

无法设置 UIImage,总是返回 nil

使用 PHImageManager 时,PHAsset 返回 UIImage 的 nil 值