如何在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
相关产品推荐
相关产品推荐

