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




