从文件加载 UIImage 不起作用,在模拟器上可以

Loading UIImage From File Doesn't Work, Does on Simulator


所以我一直在尝试从照片库中获取图像并将其保存到应用程序容器中,然后加载它。这是我的代码,非常简单:

正在创建横幅文件夹:

    //create the banner folder
[[NSFileManager defaultManager] createDirectoryAtPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingString:@"/Banners"] withIntermediateDirectories:NO attributes:NULL error:NULL];

保存图像:

 UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

//if (banner != nil)
//    [[NSFileManager defaultManager]removeItemAtURL:banner error:NULL];


long time = mach_absolute_time();
NSLog(@"saved %i",[UIImagePNGRepresentation(image) writeToFile:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingString:[NSString stringWithFormat:@"/Banners/%lu.png",time]] atomically:YES]);

banner = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingString:[NSString stringWithFormat:@"/Banners/%lu.png",time]];

//finally dismiss the picker
[picker dismissViewControllerAnimated:YES completion:NULL];

稍后加载它:

UIImageView* bannerView = [[UIImageView alloc] initWithFrame:CGRectMake(0, (CLASS_VIEW_SIZE + CLASS_VIEW_SPACE)*i, self.view.frame.size.width, CLASS_VIEW_SIZE+30)];
        UIImage* banner = [UIImage imageWithContentsOfFile:[dict objectForKey:@"banner"]];
        [bannerView setImage:banner];
        [scrollView addSubview:bannerView];

我希望它能奏效。当应用程序打开时保存文件时,一切正常。当我关闭应用程序时,它不会加载回实际设备上。 运行 这是模拟器工作正常。作为附加说明,在 Xcode 中,转到设备,单击我的应用程序并转到文档文件夹,我可以看到该文件不存在。我试过使用 NSFileManager 检查文件是否存在,但它说它不存在,即使它存在。

iOS 8.1 API 中是否发生了某些更改,导致此功能无法正常工作?我几乎只是从我的一些旧项目中复制和粘贴代码。

谢谢。

编辑: 经过更多测试后,我注意到只有当我从 Xcode 停止应用程序然后从 Xcode 启动它时它才会停止工作。关闭它并在实际设备上打开似乎没问题,但这仍然不能解释奇怪之处。

这么多步骤的结果级联到这么多其他人的输入,很难说哪一部分失败了。为了便于调试,最好将它们分解成单独的步骤。

如果应用程序突然被 Xcode 杀死时出现特定症状,则很难排除某种中断是原因。

但由于您的用户不会使用调试器终止应用程序,所以这应该不是问题。

要诊断调试器 kill 如何导致问题,我们必须了解有关代码的更多信息。

所以我弄清楚是什么导致了我的问题。我正在保存图像的绝对路径,其中包括文档目录。例如:

/var/mobile/Containers/Data/Application/1196D7EF-2791-41F5-BC53-B685873ACFBC/Documents/Banners/5873637476238.png

但是,当 Xcode 构建应用程序并 运行 时,它会更改应用程序的数字和字母,因此基本上 Application/ 之后的路径组件将变为无效,因为它会改变。这就是为什么当我没有构建它时,数字没有改变。我意识到在模拟器上,我只是启动了应用程序,而不是重新构建它。

如果更新应用程序,可能会发生同样的事情。这个问题的解决方法是使用相对路径,而不是整个路径,只保存文件名。然后在运行时获取文档目录,并将您保存的文件名附加到其中。

希望这对以后的人有所帮助。