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

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

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

谢谢。

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

最佳答案

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

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

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

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

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

关于ios - 从文件加载 UIImage 不起作用,在模拟器上可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033799/

相关文章:

iphone - 使用 dequeueReusableCellWithIdentifier 会导致用作重复背景的图像泄漏出单元格

UITableView 数组返回 nil

ios - 使按钮在所有 View Controller 中持久化

objective-c - 如何在类文件中创建然后销毁 UIWebView

iphone - 在 iOS 上管理 CPU 密集型线程

objective-c - UIPageControl 被取消选择

ios - 如何在 Swift 中获取 UICollectionViewCell 中 UISwitch 的位置

ios - Swift 无法更新父 View

iOS - UIImage imageNamed : returns null on device

ios - 动画后如何将 UIImage 保持在新位置?