PDFKIT , Swift 如何从 uitableview 中删除 pdf (PDFDocument)
PDFKIT , Swift How to remove pdf (PDFDocument) from uitableview
我有这个下载 PDF 文件的代码:
var documents = [PDFDocument]()
DispatchQueue.global(qos: .default).async(execute: {
//All stuff here
print("Download PDF");
let url=NSURL(string: urlString);
let urlData=NSData(contentsOf: url! as URL);
if((urlData) != nil)
{
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let fileName = urlString as NSString;
let filePath="\(documentsPath)/\(fileName.lastPathComponent)";
let fileExists = FileManager().fileExists(atPath: filePath)
if(fileExists){
// File is already downloaded
print("PDF Already Downloaded");
}
else{
//download
DispatchQueue.main.async(execute: { () -> Void in
print(filePath)
urlData?.write(toFile: filePath, atomically: true);
print("PDF Saved");
self.refreshData()
})
}
}
})
现在我想从 uitable视图中删除此文件 table 和 documentdirecotry 如何使用索引路径行以及如何找到要删除的文件名
我知道我会在此处删除文件,但我不知道如何准确删除 documentDirectory 和 Table
中的 PDF
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCellEditingStyle.delete) {
// handle delete (by removing the data from your array and updating the tableview)
}
}
这是我的 table 查看单元格
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BookshelfCell
let document = documents[indexPath.row]
if let documentAttributes = document.documentAttributes {
if let title = documentAttributes["Title"] as? String {
cell.title = title
}
if let author = documentAttributes["Author"] as? String {
cell.author = author
}
这是我的刷新数据部分
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let contents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
documents = contents.flatMap { PDFDocument(url: [=14=]) }
您需要完成三个步骤才能正确删除文档并更新您的 table 视图:
使用FileManager
的removeItem(at: URL)
或removeItem(atPath: String)
从磁盘中删除文件。 (请注意,这两种方法都会抛出异常,因此您需要将 do-catch 块与 try
一起使用,并且仅在该方法未抛出错误时才继续。)Update : 如果您查看 documentation for PDFDocument,您会发现除了您已经在使用的 documentAttributes
之外,还有另一个可选的 属性、documentURL
应该可以准确地告诉您什么你需要删除它。
从 documents
中删除文档(您可以使用现有代码刷新整个数组,但删除单个项目会更快)。 documents.remove(at: indexPath.row)
最后,您需要告诉 table 视图删除有问题的行(您当然可以重新加载整个 table 视图,但删除单个单元格是清洁工)tableView.deleteRows(at: [indexPath], with .fade)
如果您不熟悉 do-catch 块,这里是 Apple 关于 Swift 的书中的一些代码(请参阅下面的 link)并进行了一些简化:
do {
try makeASandwich()
eatASandwich() // This only gets called if the line above worked
} catch {
dealWithTheError() // This only gets called if makeASandwich() throws an error
}
旁注
Apple 有一个关于 Swift Language 的精彩指南,如果您还没有这样做,我建议您至少阅读 基础知识。这将使您对语言有一个基本的了解。如果您也是编程新手,我建议您在 Swift Playgrounds 应用程序中浏览 Apple 的学习编程系列,该系列在 iPad 上 免费 。该系列将指导您了解编程的所有基础知识,为您提供工具来搜索 Apple 提供的文档并找到问题的答案。
我们都在某个时候从头开始,我们都必须先爬才能走,然后才能走 运行。
我有这个下载 PDF 文件的代码:
var documents = [PDFDocument]()
DispatchQueue.global(qos: .default).async(execute: {
//All stuff here
print("Download PDF");
let url=NSURL(string: urlString);
let urlData=NSData(contentsOf: url! as URL);
if((urlData) != nil)
{
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let fileName = urlString as NSString;
let filePath="\(documentsPath)/\(fileName.lastPathComponent)";
let fileExists = FileManager().fileExists(atPath: filePath)
if(fileExists){
// File is already downloaded
print("PDF Already Downloaded");
}
else{
//download
DispatchQueue.main.async(execute: { () -> Void in
print(filePath)
urlData?.write(toFile: filePath, atomically: true);
print("PDF Saved");
self.refreshData()
})
}
}
})
现在我想从 uitable视图中删除此文件 table 和 documentdirecotry 如何使用索引路径行以及如何找到要删除的文件名
我知道我会在此处删除文件,但我不知道如何准确删除 documentDirectory 和 Table
中的 PDFoverride func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCellEditingStyle.delete) {
// handle delete (by removing the data from your array and updating the tableview)
}
}
这是我的 table 查看单元格
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BookshelfCell
let document = documents[indexPath.row]
if let documentAttributes = document.documentAttributes {
if let title = documentAttributes["Title"] as? String {
cell.title = title
}
if let author = documentAttributes["Author"] as? String {
cell.author = author
}
这是我的刷新数据部分
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let contents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
documents = contents.flatMap { PDFDocument(url: [=14=]) }
您需要完成三个步骤才能正确删除文档并更新您的 table 视图:
使用
FileManager
的removeItem(at: URL)
或removeItem(atPath: String)
从磁盘中删除文件。 (请注意,这两种方法都会抛出异常,因此您需要将 do-catch 块与try
一起使用,并且仅在该方法未抛出错误时才继续。)Update : 如果您查看 documentation for PDFDocument,您会发现除了您已经在使用的documentAttributes
之外,还有另一个可选的 属性、documentURL
应该可以准确地告诉您什么你需要删除它。从
documents
中删除文档(您可以使用现有代码刷新整个数组,但删除单个项目会更快)。documents.remove(at: indexPath.row)
最后,您需要告诉 table 视图删除有问题的行(您当然可以重新加载整个 table 视图,但删除单个单元格是清洁工)
tableView.deleteRows(at: [indexPath], with .fade)
如果您不熟悉 do-catch 块,这里是 Apple 关于 Swift 的书中的一些代码(请参阅下面的 link)并进行了一些简化:
do {
try makeASandwich()
eatASandwich() // This only gets called if the line above worked
} catch {
dealWithTheError() // This only gets called if makeASandwich() throws an error
}
旁注
Apple 有一个关于 Swift Language 的精彩指南,如果您还没有这样做,我建议您至少阅读 基础知识。这将使您对语言有一个基本的了解。如果您也是编程新手,我建议您在 Swift Playgrounds 应用程序中浏览 Apple 的学习编程系列,该系列在 iPad 上 免费 。该系列将指导您了解编程的所有基础知识,为您提供工具来搜索 Apple 提供的文档并找到问题的答案。
我们都在某个时候从头开始,我们都必须先爬才能走,然后才能走 运行。