iOS - UIImage imageNamed:在设备上返回 null
Posted
技术标签:
【中文标题】iOS - UIImage imageNamed:在设备上返回 null【英文标题】:iOS - UIImage imageNamed: returns null on device 【发布时间】:2013-04-07 18:33:11 【问题描述】:[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"]);
那行代码给了我设备的空值,我真的不知道我现在做错了什么。
【问题讨论】:
【参考方案1】:我最近也遇到这样的问题。
在使用文件名和路径之后,有时它会在您清理和重建项目时有所帮助。
【讨论】:
我很确定我以前做过几次。现在它起作用了。谢谢。 检查:XCode - Build Phases - Copy Bundle Resources -see image is available or not add & run
.【参考方案2】:
我最近也遇到了同样的情况。
我的解决方案是在文件名中添加扩展名。
[UIImage imageNamed:@"Bar.png"]
【讨论】:
谢谢。刚刚尝试过,不幸的是它对我的情况没有帮助。 如果 png 无关紧要......也许你遇到了另一种文件格式 不,它是 png,并且downvote 似乎不太合适。 报复性投票也是一种糟糕的做法,请避免。【参考方案3】:彻底清理您的构建并重做:
-
从设备中删除应用程序
选项-清理 Xcode 中的整个构建目录 (⌘-Shift-K)
退出 xcode
删除 ~/Library/Developer/Xcode/DerivedData
重启 xcode,构建并运行
【讨论】:
【参考方案4】:这只是发生在我身上,而且发现起来非常困难:我有一张图像,它只是在设备上为零
logoWhite.png
我的代码:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"LogoWhite"] forBarMetrics:UIBarMetricsDefault];
经过一段时间的调试,我注意到图像的名称以大写字母开头。显然,这在带有忽略大小写文件系统的 OSX 上并不重要。 ios 文件系统不是,所以图像在模拟器上工作,但在设备上不工作。
我敢打赌,所有关于清理派生数据和重建的解决方案都会随机以重命名图像结束,这也可以解决问题。只是在这里发布以供将来参考:)
【讨论】:
OP 实际上提到他检查了文件名的大小写,因为 (simulator=case-insensitive vs device=case-sensitive) 是一个众所周知的问题。因此,在这种情况下,问题不是文件名。【参考方案5】:我遇到了这个问题,刚刚修复它。我列出了下面的解决方案作为参考。
我有几个图像,并使用 [UIImage imageNamed:filePath] 来显示它们。除了模拟器/设备上的 1 个图像外,所有图像都显示良好,但所有图像都可以在 OS X 上看到。对于该图像,[UIImage imageNamed] 始终返回 null。
经过几分钟的调查,我发现图像导致问题的文件大小很大:4.1M。其他的都在800kb左右。它们的尺寸几乎相同。
然后我尝试在图像编辑器中打开它,然后重新保存它。在此之后,大小下降到 800k。问题解决了。
我猜的原因,
[UIImage imageNamed:filePath] 有最大文件大小限制? (可能性小,但需要查看官方文档)
图像本身有一些错误。但是 OS X 比 iOS 有更好的容忍度。所以 iOS 无法读取并返回 null。这个问题就像 OS X 可以播放比 iOS 更多类型的视频文件,因为它支持更多的编解码器。
因此,如果您以后遇到此问题,请花几秒钟时间查看文件大小。希望有所帮助。
【讨论】:
【参考方案6】:这是一个奇怪的问题,直到这周我才看到。
以下是我的发现,以及解决您问题的方法。
在我的 iPhone 应用程序中,我下载了一张图片并将其存储在本地,这一直运行良好。
但是现在当我运行相同的代码时,它突然无法使用 imageNamed
函数从中创建一个 UIImage
,现在它返回 nil。
三个注意事项:
-
这个确切的代码以前确实有效,使用相同的源代码和 .png 图像文件。我不确定我的 XCode 6.x 或 iOS 8.x 副本是否在此期间悄悄地自行更新了。
代码继续在 iPhone 模拟器上正常工作(使用相同的图像文件)。它只是在真实设备上不起作用。
看看下面的代码。当
UIImage:imageNamed
失败时,我运行了一些代码来检查该文件是否确实存在.. 它确实存在。然后我使用NSData:contentsAtPath
从文件中加载二进制数据(这也证明文件存在并且在正确的文件夹中),然后创建了一个UIImage
,它工作正常。
啊?!
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 模拟器上继续正常工作),但我发现以下一行 确实 工作正常:
UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename];
因此,您似乎应该使用此函数来加载不属于您的应用程序包的图像。
【讨论】:
【参考方案7】:我也有同样的问题:XCode - Build Phases - Copy Bundle Resources -
查看图片是否可用- addimage - clean - delete app - Run
。
【讨论】:
【参考方案8】:我想对上述所有解决方案再补充一点
确保将您的图片资源添加到正确的目标
如果开发人员将资源和目标的链接弄乱了,就会出现条件。
如果您有多个目标,请仔细检查资源是否设置为正确的目标。
附上多个目标之间资源链接的截图示例。
【讨论】:
以上是关于iOS - UIImage imageNamed:在设备上返回 null的主要内容,如果未能解决你的问题,请参考以下文章
UIImage imageNamed:不会自动选择视网膜@2x 图像
UIImage + NSCache 与 [UIImage imageNamed:]
iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?