我有以下代码将用户草图数据保存到文件...
//Auto Save the sketch
NSString *filename = [NSString stringWithFormat:@"%@.png", sketchID];
CGImageRef imageRef = CGBitmapContextCreateImage(paintView.canvas.mBitmapContext);
UIImage* image = [[UIImage alloc] initWithCGImage:imageRef];
NSData* imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:filename atomically:YES];
CGImageRelease(imageRef);
[image release];
SketchID
是一个唯一的字母数字值,因此我保存的文件名的示例是“p1.png”。我用来读取文件的代码是......
//Load the sketch where the user left off, if there is one
if(fileName != nil)
{
UIImage* image = [UIImage imageWithContentsOfFile:fileName];
if(image != nil)
{
.
.
在模拟器上运行时,此代码似乎工作正常,但是当我在设备上运行时,无法加载图像。我是iOS开发的新手,我还在学习如何存储文件。我的问题是......
writeToFile:
方法时,“p1.png”应该可以正常工作吗?那imageWithContentsOfFile:
方法呢?答案 0 :(得分:5)
为什么保存/加载文件有效 在模拟器上,但不是设备?
有很多原因,但最常见的是尝试写入设备上无法写入的位置,最常见的原因是写入应用程序包本身。
所有iPhone应用程序都在设备上“沙盒化”,这意味着他们无法访问安装该应用程序的目录之外的文件系统。
当我创建我想要的文件名时 保存数据,我是否也需要 包括特定目录的路径 在iPhone上应该有数据 妥善存放?或者应该“p1.png” 当我调用writeToFile时工作正常: 方法?那怎么样? imageWithContentsOfFile:方法?
您可以写入应用程序的临时目录(如果您只需要在运行期间暂时放置某些内容)或Documents目录(如果您需要更永久地存储某些内容,并且还要通过iTunes备份它)。
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
答案 1 :(得分:0)
我发现模拟器在写文件方面非常宽容,但设备当然不是。我的问题是我正在创建错误的模拟器没有捕获的filePath。模拟器应该抓住了这个。
这是我的错误和正确的快速代码
docsDir!+"filename.dat" // wrong does not have path separator between dir and file
docsDir!.stringByAppendingPathComponent("filename.dat") // works since it puts the "/" in between the two.