You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iPad应用开发技术问询:如何从临时文件获取所有已保存PDF的URL和名称并转换为NSObject

解决iPad应用中读取Documents目录所有PDF并封装为NSObject的问题

看起来你在处理iPad应用里PDF的存储和读取时卡壳了——能成功把PDF写入Documents目录,但不知道怎么把所有已保存PDF的URL和名称封装成NSObject类型的对象。先帮你捋捋原读取代码里的问题,再给你完整的解决方案:

首先,你的读取代码有两个关键错误:

  • 你构造的pathURL是直接在Documents目录下拼接了.pdf,这其实是在找一个名叫.pdf的文件,而不是遍历目录里所有的PDF文件
  • 尝试用String(contentsOf:)读取PDF文件完全不对,PDF是二进制格式,不能直接转成字符串来遍历

下面是一步步的解决办法:

1. 先定义NSObject子类来存PDF信息

我们先创建一个继承自NSObject的类,专门用来保存每个PDF的URL和名称,这样后续处理起来更方便:

class PDFItem: NSObject {
    let fileURL: URL
    let fileName: String
    
    init(fileURL: URL, fileName: String) {
        self.fileURL = fileURL
        self.fileName = fileName
        super.init()
    }
}

2. 写方法遍历目录并封装所有PDF

接下来实现一个方法,遍历Documents目录下的所有文件,筛选出PDF格式的,然后把每个PDF的信息封装成上面定义的PDFItem对象:

func getAllSavedPDFItems() -> [PDFItem] {
    var pdfItems = [PDFItem]()
    // 获取Documents目录的URL
    let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    
    do {
        // 获取目录下所有文件的URL
        let allFileURLs = try FileManager.default.contentsOfDirectory(at: documentsDirectoryURL, includingPropertiesForKeys: nil)
        
        // 筛选出后缀为pdf的文件
        for fileURL in allFileURLs {
            if fileURL.pathExtension.lowercased() == "pdf" {
                // 获取不带后缀的文件名
                let fileName = fileURL.deletingPathExtension().lastPathComponent
                // 创建PDFItem对象并存入数组
                let pdfItem = PDFItem(fileURL: fileURL, fileName: fileName)
                pdfItems.append(pdfItem)
            }
        }
    } catch {
        print("读取Documents目录失败: \(error.localizedDescription)")
    }
    
    return pdfItems
}

3. 调用示例

现在你可以这样调用这个方法,拿到所有封装好的PDF信息:

let allSavedPDFs = getAllSavedPDFItems()
// 遍历打印每个PDF的信息
for pdf in allSavedPDFs {
    print("PDF名称: \(pdf.fileName)")
    print("PDF路径: \(pdf.fileURL.absoluteString)")
}

再回头说下原代码的问题

  • 你之前构造的pathURL是错误的,appendingPathComponent(".pdf")生成的是一个不存在的文件路径,自然读不到内容
  • PDF是二进制数据,用String(contentsOf:)读取会导致数据乱码,而且这种方式根本不是用来获取目录下文件列表的,完全找错方向了

这样修改后,你就能正确获取所有已保存的PDF文件信息,并且都封装成NSObject类型的对象了。

内容的提问来源于stack exchange,提问作者aig_88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:32:45