You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS Swift:如何用UIWebView加载Documents目录中保存的PDF?

解决UIWebView加载本地PDF空白的问题

我帮你梳理几个大概率导致问题的原因,以及对应的解决办法:

1. 弹窗的WebView还未完成初始化

你现在是在present(popup)之前就调用popup.webView?.loadRequest(request),这时候PDFViewController的视图还没被加载,webView大概率还是nil,自然没法加载内容。

解决办法
不要在外部直接调用webView的加载方法,而是把URL传递给PDFViewController,让它在自身的生命周期方法里完成加载。

修改你的didSelectRowAt代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let selectedDoc = tableView.cellForRow(at: indexPath) as? DisplayMainSavedDataCell,
          let documentName = selectedDoc.documentNameLabel.text else {
        return
    }
    print(documentName)
    
    let path = fetchDocumentURL(documentName: documentName)
    guard path != "No path exists" else {
        print("未找到文件路径")
        return
    }
    
    let urlDoc = URL(fileURLWithPath: path)
    // 先确认文件真的存在
    guard FileManager.default.fileExists(atPath: urlDoc.path) else {
        print("文件不存在:\(urlDoc.path)")
        return
    }
    print(urlDoc)
    
    let sb = UIStoryboard(name: "Main", bundle: nil)
    let popup = sb.instantiateViewController(withIdentifier: "pdfPopUp") as! PDFViewController
    // 给PDFViewController添加一个接收URL的属性
    popup.targetPDFURL = urlDoc
    present(popup, animated: true)
}

然后在PDFViewController中添加属性并在视图加载后执行加载:

class PDFViewController: UIViewController {
    var targetPDFURL: URL?
    @IBOutlet weak var webView: UIWebView! // 确保这个IBOutlet已经正确关联到storyboard
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let pdfURL = targetPDFURL else { return }
        let request = URLRequest(url: pdfURL)
        webView.loadRequest(request)
        // 加上代理排查加载错误
        webView.delegate = self
    }
}

// 实现代理查看加载失败原因
extension PDFViewController: UIWebViewDelegate {
    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
        print("PDF加载失败:\(error.localizedDescription)")
    }
}

2. 确认文件路径的有效性

你的fetchDocumentURL方法返回的路径,要确保是完整的沙盒路径(比如/var/mobile/Containers/Data/Application/xxx/Documents/xxx.pdf),另外建议在获取路径后,一定要通过FileManager确认文件存在,避免加载不存在的资源。

3. 替换UIWebView为WKWebView(强烈推荐)

UIWebView已经在iOS 12之后被苹果废弃了,WKWebView对PDF的支持更稳定、性能更好,还能避免很多旧组件的兼容性问题。替换后的示例代码:

在PDFViewController中:

import WebKit

class PDFViewController: UIViewController {
    var targetPDFURL: URL?
    @IBOutlet weak var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let pdfURL = targetPDFURL else { return }
        // 加载本地文件需要允许读取权限
        webView.loadFileURL(pdfURL, allowingReadAccessTo: pdfURL.deletingLastPathComponent())
    }
}

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

火山引擎 最新活动