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 视图:

  1. 使用FileManagerremoveItem(at: URL)removeItem(atPath: String)从磁盘中删除文件。 (请注意,这两种方法都会抛出异常,因此您需要将 do-catch 块与 try 一起使用,并且仅在该方法未抛出错误时才继续。)Update : 如果您查看 documentation for PDFDocument,您会发现除了您已经在使用的 documentAttributes 之外,还有另一个可选的 属性、documentURL 应该可以准确地告诉您什么你需要删除它。

  2. documents 中删除文档(您可以使用现有代码刷新整个数组,但删除单个项目会更快)。 documents.remove(at: indexPath.row)

  3. 最后,您需要告诉 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 提供的文档并找到问题的答案。

我们都在某个时候从头开始,我们都必须先爬才能走,然后才能走 运行。