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

iOS Swift 5基于SimplePDFBuilder实现PDF生成按钮遇阻求助

问题分析与解决方案
  • 核心问题:变量作用域错误
    你在viewDidLoad中创建的PDFBuilder实例是局部变量,在@IBAction方法中无法访问,调用pdf.build()时会直接报错,这是PDF生成失败的直接原因。

  • 修正步骤

  1. 调整变量作用域,将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)
    }
}
  1. 添加分享功能
    若需要在预览页面实现分享,可在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)
    }
}
  1. 额外注意事项
    • 确保SimplePDFBuilder依赖为最新版本,避免库本身的已知bug
    • 若PDF内容显示异常,可尝试指定页面尺寸:pdfBuilder.withPageSize(.A4)
    • 测试分享功能时,注意部分应用可能需要特定的文件格式支持,可将PDF数据写入临时文件后再分享

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:21:57