iOS Swift 5基于SimplePDFBuilder实现PDF生成按钮遇阻求助
问题分析与解决方案
核心问题:变量作用域错误
你在viewDidLoad中创建的PDFBuilder实例是局部变量,在@IBAction方法中无法访问,调用pdf.build()时会直接报错,这是PDF生成失败的直接原因。修正步骤
- 调整变量作用域,将
PDFBuilder声明为ViewController的类属性,确保在整个类范围内可访问:
import UIKit import SimplePDFBuilder class ViewController: UIViewController { // 声明为类属性,确保全局可访问 private var pdfBuilder: PDFBuilder! override func viewDidLoad() { super.viewDidLoad() // 初始化PDFBuilder实例 pdfBuilder = PDFBuilder() pdfBuilder.withMetaAuthor("Maks") pdfBuilder.withMetaCreator("Maks") pdfBuilder.withMetaTitle("My PDF") pdfBuilder.addFooter(pagingEnabled: true, text: "© Company copyrights reserved footer.", colour: UIColor.black.withAlphaComponent(0.5)) pdfBuilder.addText(text: "Sample text") } @IBAction func generatePDF(_ sender: UIButton) { // 使用类属性构建PDF数据,增加空值判断 guard let pdfData = pdfBuilder.build() else { print("PDF生成失败") return } let pdfController = PDFPreviewVC(pdfData: pdfData) navigationController?.pushViewController(pdfController, animated: true) } }
- 添加分享功能
若需要在预览页面实现分享,可在PDFPreviewVC中添加分享按钮,借助UIActivityViewController完成分享逻辑:
class PDFPreviewVC: UIViewController { private let pdfData: Data init(pdfData: Data) { self.pdfData = pdfData super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // 添加PDF预览视图(推荐使用WKWebView替代UIWebView) let webView = WKWebView(frame: view.bounds) webView.load(pdfData, mimeType: "application/pdf", characterEncodingName: "", baseURL: URL(fileURLWithPath: "")) view.addSubview(webView) // 导航栏添加分享按钮 let shareButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(sharePDF)) navigationItem.rightBarButtonItem = shareButton } @objc private func sharePDF() { let activityVC = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil) // 适配iPad设备 if let popover = activityVC.popoverPresentationController { popover.barButtonItem = navigationItem.rightBarButtonItem } present(activityVC, animated: true) } }
- 额外注意事项
- 确保
SimplePDFBuilder依赖为最新版本,避免库本身的已知bug - 若PDF内容显示异常,可尝试指定页面尺寸:
pdfBuilder.withPageSize(.A4) - 测试分享功能时,注意部分应用可能需要特定的文件格式支持,可将PDF数据写入临时文件后再分享
- 确保
内容的提问来源于stack exchange,提问作者Fishfood96
相关产品推荐
相关产品推荐

