我有一个项目,我正在努力将数据保存到PDF。代码是:
// Save PDF Data
let recipeItemName = nameTextField.text
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
pdfData.writeToFile("\(documentsPath)/\(recipeFileName).pdf", atomically: true)
我能够在另一个UITableView
中的单独ViewController
中查看文件。当用户滑动UITableViewCell
时,我希望它也从.DocumentDirectory
中删除该项目。我UITableView
删除的代码是:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
// Delete the row from the data source
savedPDFFiles.removeAtIndex(indexPath.row)
// Delete actual row
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
// Deletion code for deleting from .DocumentDirectory here???
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
我尝试在网上找到答案,但找不到Swift 2的任何内容。有人可以帮忙吗?
我尝试过这个但没有运气:
var fileManager:NSFileManager = NSFileManager.defaultManager()
var error:NSErrorPointer = NSErrorPointer()
fileManager.removeItemAtPath(filePath, error: error)
我只想删除特定项目,而不是DocumentDirectory
。
答案 0 :(得分:7)
removeItemAtPath:error:
是Objective-C版本。对于swift,你需要removeItemAtPath
,如下所示:
do {
try NSFileManager.defaultManager().removeItemAtPath(path)
} catch {}
在swift中,这是一种非常常见的模式,在处理throw
的方法时,会使用try
作为前缀,并将其括在do-catch
中。你会在objective-c中用错误指针做更少的事情。相反,需要捕获错误,或者像上面的代码段一样,忽略错误。要捕获并处理错误,您可以像这样删除:
do {
let fileManager = NSFileManager.defaultManager()
let documentDirectoryURLs = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
if let filePath = documentDirectoryURLs.first?.URLByAppendingPathComponent("myFile.pdf").path {
try fileManager.removeItemAtPath(filePath)
}
} catch let error as NSError {
print("ERROR: \(error)")
}
答案 1 :(得分:1)
您要做的是从已编辑的单元格中检索recipeFileName
以重建文件路径。
目前还不清楚您如何填充UITableViewCell
数据,因此我将介绍最常见的情况。
假设您有一组文件用于填充dataSource
。
let recipeFiles = [RecipeFile]()
使用RecipeFile
结构
struct RecipeFile {
var name: String
}
在tableView(_:cellForRowAtIndexPath:)
中,您可能会像这样设置recipeFile:
cell.recipeFile = recipeFiles[indexPath.row]
所以在tableView(_:commitEditingStyle:forRowAtIndexPath:)
中,你可以像这样检索文件名:
let recipeFile = recipeFiles[indexPath.row]
并删除您的文件
var fileManager:NSFileManager = NSFileManager.defaultManager()
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = "\(documentsPath)/\(recipeFile.name).pdf"
do {
fileManager.removeItemAtPath(filePath, error: error)
} catch _ {
//catch any errors
}