从文件加载UIImage无法正常工作,是否在模拟器上运行

时间:2015-01-19 21:30:53

标签: ios objective-c uiimage


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

创建横幅文件夹:

    //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中,转到设备,点击我的应用程序并转到Documents文件夹,我可以看到该文件不存在。我已经尝试检查该文件是否与NSFileManager一起存在,但它表示它不存在,即使它存在。

iOS 8.1 API中有什么变化导致这不起作用吗?我几乎只是复制并粘贴了一些旧项目的代码。

感谢。

编辑: 经过一些测试后,我注意到当我从Xcode停止应用程序然后从Xcode启动它时它才停止工作。关闭它并在实际设备上打开似乎很好,但这仍然无法解释奇怪的事情。

2 个答案:

答案 0 :(得分:2)

所以我想出了导致我问题的原因。我正在保存图像的绝对路径,其中包括文档目录。例如:

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

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

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

希望这有助于将来。

答案 1 :(得分:1)

由于许多步骤的结果与许多其他步骤的输入相结合,因此很难说哪个部分失败了。为了调试能力,最好将它们分解为单独的步骤。

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

但是,由于您的用户不会使用调试器来杀死应用程序,因此它应该不是问题。

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