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

如何在UIKit应用中自动列出PDF文件,无需逐个编码实现?

当然不用手动逐个编码啦!完全有自动化的解决方案,而且实现起来也不复杂——我们可以让应用自动扫描Bundle里的所有PDF文件,然后动态生成列表和打开功能,以后加新PDF直接拖进项目就行,不用改一行代码。下面是基于UIKit的具体实现步骤:

实现步骤

1. 扫描Bundle中的PDF文件

首先写一个工具方法,用FileManager遍历应用Bundle的资源目录,筛选出所有后缀为.pdf的文件:

private func getAllPDFFiles() -> [URL] {
    let fileManager = FileManager.default
    guard let bundleResourcesURL = Bundle.main.resourceURL else {
        return []
    }
    
    do {
        // 获取Bundle目录下的所有文件
        let allFiles = try fileManager.contentsOfDirectory(at: bundleResourcesURL, includingPropertiesForKeys: nil)
        // 筛选出PDF格式的文件
        let pdfFiles = allFiles.filter { $0.pathExtension.lowercased() == "pdf" }
        // 按文件名排序,让列表更整齐
        return pdfFiles.sorted { $0.lastPathComponent.lowercased() < $1.lastPathComponent.lowercased() }
    } catch {
        print("获取PDF文件失败: \(error.localizedDescription)")
        return []
    }
}

2. 用UITableView动态展示PDF列表

接下来用UITableView来展示这些PDF文件,每个cell对应一个PDF,点击cell就打开对应的文件。这里直接写一个完整的ViewController示例:

import UIKit
// 如果用PDFKit展示,需要导入这个框架
// import PDFKit

class PDFListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    private var pdfFiles: [URL] = []
    private let tableView = UITableView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "部门指南"
        setupTableViewLayout()
        // 加载所有PDF文件并刷新列表
        pdfFiles = getAllPDFFiles()
        tableView.reloadData()
    }
    
    private func setupTableViewLayout() {
        tableView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(tableView)
        
        // 布局TableView到安全区域
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
        ])
        
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "PDFCell")
    }
    
    // MARK: - UITableView 数据源方法
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return pdfFiles.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PDFCell", for: indexPath)
        let pdfURL = pdfFiles[indexPath.row]
        // 显示去掉后缀的文件名,更友好
        cell.textLabel?.text = pdfURL.deletingPathExtension().lastPathComponent
        cell.accessoryType = .disclosureIndicator
        return cell
    }
    
    // MARK: - UITableView 代理方法(处理点击)
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let targetPDF = pdfFiles[indexPath.row]
        openPDFFile(url: targetPDF)
    }
    
    // 打开PDF的方法,这里提供两种常用方案
    private func openPDFFile(url: URL) {
        // 方案1:用WKWebView展示(无需额外导入框架)
        let webVC = UIViewController()
        let webView = WKWebView(frame: webVC.view.bounds)
        webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent())
        webVC.view.addSubview(webView)
        navigationController?.pushViewController(webVC, animated: true)
        
        // 方案2:用PDFKit的PDFView展示(体验更好,需要导入PDFKit)
        /*
        let pdfVC = UIViewController()
        let pdfView = PDFView(frame: pdfVC.view.bounds)
        pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        if let pdfDoc = PDFDocument(url: url) {
            pdfView.document = pdfDoc
        }
        pdfVC.view.addSubview(pdfView)
        navigationController?.pushViewController(pdfVC, animated: true)
        */
    }
    
    // 复用之前的扫描PDF方法
    private func getAllPDFFiles() -> [URL] {
        let fileManager = FileManager.default
        guard let bundleResourcesURL = Bundle.main.resourceURL else {
            return []
        }
        
        do {
            let allFiles = try fileManager.contentsOfDirectory(at: bundleResourcesURL, includingPropertiesForKeys: nil)
            let pdfFiles = allFiles.filter { $0.pathExtension.lowercased() == "pdf" }
            return pdfFiles.sorted { $0.lastPathComponent.lowercased() < $1.lastPathComponent.lowercased() }
        } catch {
            print("获取PDF文件失败: \(error.localizedDescription)")
            return []
        }
    }
}

3. 关键注意事项

  • 确保PDF文件正确加入项目:添加PDF到Xcode时,要勾选对应的target,并且在Build Phases → Copy Bundle Resources里能看到这些文件(默认添加时会自动勾选,但最好检查一下)。
  • 扫描子文件夹的情况:如果你的PDF放在Bundle的子文件夹里,上面的方法只会扫描根目录。如果需要递归扫描所有子文件夹,可以修改contentsOfDirectory的调用,加上options: .skipsHiddenFiles,或者用递归遍历的方式处理。
  • 自定义样式:你可以根据需求自定义UITableViewCell的样式,比如添加图标、调整字体等,让列表更符合部门应用的风格。

这样以后你只要把新的PDF文件拖进Xcode项目,应用启动时就会自动扫描并展示在列表里,完全不用手动写代码添加每个PDF的打开逻辑啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:28:41