我有一个用例需要将UIImage
保存到文档目录 - 然后UIImage
需要转换为PDF并保存到文档目录。
转换为PDF格式的代码
var filePath = NSString(string: self.selectedMedia!.imagePath!)
if FileManager().fileExists(atPath: filePath as String) {
filePath = filePath.deletingPathExtension as NSString
filePath = NSString(string: filePath.appendingPathExtension("PDF")!)
if let image = UIImage(data: self.selectedMedia?.image! as! Data) {
let rect:CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
UIGraphicsBeginPDFContextToFile(filePath as String, rect, nil);
UIGraphicsBeginPDFPageWithInfo(rect, nil);
UIGraphicsGetCurrentContext();
image.draw(in: rect)
UIGraphicsEndPDFContext();
self.selectedMedia?.imagePath = filePath as String
CoreData.save()
}
self.showPDFEditor()
}
else {
print("Missing File At Path \(filePath)")
}
问题
FileManager
表示文件不存在。第一次执行此文件时, 之前我们创建PDF,FileManager可以检测到图像PDF确实存在。但是之后我们会从图片中创建PDF - 即使图片PNG仍在未触及的文档目录中(请参阅app容器下面的图片以进行校对),FileManager
表示PNG没有存在?
问题
为什么FileManager
忽略了明显的事实并使我的应用程序无法运行?
答案 0 :(得分:13)
我的PDF和图片位于iOS文件系统中的Documents
目录下。每次运行应用程序时,iOS都会将root path
更改为文档目录。因此,如上所述保存imagePath
可以正常工作,直到我重新启动应用。那是因为我将整个路径存储到我的selectedMedia
对象。
file:///var/mobile/Containers/Data/Application/7A31EDFD-8644-45A5-8381-FE189E27D6E5/Documents/
file:///var/mobile/Containers/Data/Application/URID09RE-5711-TI70-1252-OP4G5JH3WDST/Documents/
了解Application/someLongNumber/
的不同之处。这就是为什么当你检查一个文件是否在你的文件目录中并且实际上在那里时,但根路径已经改变了。
而不是存储整个文件路径只是存储来自文档目录的子路径。所以我所做的是在文件目录中创建了一个名为Media
的子文件夹,我将文件保存到,并且我存储到我的imagePath
对象的路径将是Media/theFileName.PNG
。
因此,您需要做的是在运行时生成/Documents
目录的路径。我不能强调这一部分。这样可以保证您每次都访问的实际文档目录。查看此SO answer以获取有关如何生成文档目录路径的提示。
获得运行时文档目录的路径后,只需将存储的路径添加到该文件的末尾,它应如下所示:
file:///var/mobile/Containers/Data/Application/URID09RE-5711-TI70-1252-OP4G5JH3WDST/Documents/Media/theFileName.PNG