从文件加载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中,转到设备,单击我的应用程序并转到"文档"文件夹,我可以看到该文件不存在。我尝试使用 NSFileManager 检查该文件是否存在,但它说它不存在,即使它在那里。

iOS 8.1 API 中是否有一些变化使其不起作用?我几乎只是从我的一些旧项目中复制和粘贴代码。

谢谢。

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

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

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

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

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

希望这对将来的某人有所帮助。

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

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

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

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

相关内容

最新更新