这是一个奇怪的问题,直到本周我才看到。
以下是我的发现,以及解决您的问题的方法。
在我的 iPhone 应用程序中,我下载了一张图片并将其存储在本地,这一直运行良好。
但是现在当我运行相同的代码时,它突然无法UIImage
使用该imageNamed
函数创建它,现在它返回 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 Simulator 上仍然可以正常工作),但我发现以下一行确实可以正常工作:
UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename];
所以看起来你应该使用这个函数来加载不属于你的应用程序包的图像。