这是一个奇怪的问题,直到本周我才看到。
以下是我的发现和解决方法。
在我的 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)
{
self.imgBackgroundView.image = img;
}
else
{
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:backgroundImageFilename];
if (fileExists)
NSLog(@"Image file does exist.");
else
NSLog(@"Image file does not exist.");
NSData *data = [[NSFileManager defaultManager] contentsAtPath:backgroundImageFilename];
if (data != nil)
{
img = [UIImage imageWithData:data];
if (img != nil)
{
self.imgBackgroundView.image = img;
}
}
}
就像我说的那样,这段代码确实提供了解决这个问题的方法,但很奇怪的是它突然开始出现。
并且,我应该说一下,我尝试了这个帖子中的其他建议,清理项目,删除DerivedData,完全从设备上删除应用程序等等,但它们没有产生任何影响。
我想知道是否还有其他人遇到这个问题,并发现我的代码示例对他们也有效。
更新
我真是个白痴。
我不确定UIImage:imageNamed
函数是否改变了什么(如果确实改变了,为什么在iPhone 8.1模拟器上仍然可以正常工作),但我发现下面这行代码确实可以正常工作:
UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename];
因此,看起来您应该使用此函数来加载不属于您应用程序包的图像。
XCode - Build Phases - Copy Bundle Resources - {查看是否有图像可用} 添加并运行
. - Vicky