在我的iPhone应用程序上,我通过以下代码保存与活动相关的图片:
[pngData writeToFile:filePath atomically:YES]; //Write the file
self.thisTransaction.picPath = filePath;
稍后我使用以下代码检索并显示照片:
UIImage * image = [UIImage imageWithContentsOfFile:thisTransaction.picPath];
在我的iPad上运行得很好(我没有iPhone)。
但是,如果我在不涉及上述行的Xcode代码修改后将iPad连接到我的MB专业版来更新应用程序,然后断开并独立运行它,则不会检索预期picPath
处的图片。与核心数据中的thisTransaction
相关联的所有其他数据完整且未更改,但更新后预期的图片不会出现在设备上。
有人可以告诉我哪里出错了吗?
编辑以阐明文件路径构建
pngData = UIImagePNGRepresentation(capturedImage.scaledImage);
NSLog(@"1 The size of pngData should be %lu",(unsigned long)pngData.length);
//Save the image someplace, and add the path to this transaction's picPath attribute
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
int timestamp = [[NSDate date] timeIntervalSince1970];
NSString *timeTag = [NSString stringWithFormat:@"%d",timestamp];
filePath = [documentsPath stringByAppendingPathComponent:timeTag]; //Add the file name
NSLog(@"1 The picture was saved at %@",filePath);
控制台日志显示此filePath:
/用户/ YoursTruly /库/开发商/ CoreSimulator /设备/ 65FB33E1-03A7-430D-894D-0C1893E03120 /数据/容器/数据/应用/ EB9B9523-003E-4613-8C34-4E91B3357F5A /文档/ 1433624434
答案 0 :(得分:1)
您遇到的问题是应用程序沙箱的位置会随着时间的推移而发生变化。通常,这会在应用程序更新时发生。所以你可以做的最糟糕的事情是坚持绝对文件路径。
您需要做的是仅保留路径相对于基本路径的部分(在这种情况下," Documents"文件夹)。
然后,当您想再次重新加载文件时,将持久的相对路径追加到" Documents"的当前值。文件夹中。
所以你的代码必须是这样的:
保存文件:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
int timestamp = [[NSDate date] timeIntervalSince1970];
NSString *timeTag = [NSString stringWithFormat:@"%d",timestamp];
filePath = [documentsPath stringByAppendingPathComponent:timeTag]; //Add the file name
[pngData writeToFile:filePath atomically:YES]; //Write the file
self.thisTransaction.picPath = timeTag; // not filePath
加载文件:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
NSString *filePath = [documentsPath stringByAppendingPathComponent:thisTransaction.picPath];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];