QLPreviewController在SwiftUI TabView(.page样式)中无法加载PDF怎么办?
解决SwiftUI Page样式TabView中QLPreviewController无法加载PDF的问题
在Page样式的TabView中,QLPreviewController常因布局空间不足、视图切换时数据源未及时刷新等问题,无法正常渲染PDF内容,以下是具体修复方案:
修复步骤及代码调整
1. 让PreviewController占满Tab页空间
QLPreviewController需要足够的布局尺寸才能显示内容,给每个PreviewController添加帧约束:
PreviewController(url: url) .tag(num) .frame(maxWidth: .infinity, maxHeight: .infinity)
2. 强制QLPreviewController刷新数据
在UIViewControllerRepresentable的初始化和更新方法中,主动调用reloadData(),确保数据源在初始化和页面切换时都能正确加载:
修改后的PreviewController代码:
struct PreviewController: UIViewControllerRepresentable { let url: URL func makeUIViewController(context: Context) -> QLPreviewController { let controller = QLPreviewController() controller.dataSource = context.coordinator controller.reloadData() // 初始化后立即刷新数据 return controller } func updateUIViewController(_ uiViewController: QLPreviewController, context: Context) { // 页面切换时重新绑定数据源并刷新 uiViewController.dataSource = context.coordinator uiViewController.reloadData() } func makeCoordinator() -> Coordinator { Coordinator(parent: self) } class Coordinator: NSObject, QLPreviewControllerDataSource { let parent: PreviewController init(parent: PreviewController) { self.parent = parent } func numberOfPreviewItems(in controller: QLPreviewController) -> Int { 1 } func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { parent.url as NSURL } } }
3. 检查PDF文件的Bundle配置
确保你的Sample-PDF.pdf已添加到项目的Bundle资源中:
- 选中项目Target
- 进入
Build Phases->Copy Bundle Resources - 确认PDF文件在列表中,未添加则点击
+按钮添加
完整的QuickLookView代码
struct QuickLookView: View { @State private var url: URL = Bundle.main.url(forResource: "Sample-PDF", withExtension: "pdf")! @State private var tab: Int = 0 var body: some View { NavigationStack { TabView(selection: $tab) { ForEach(0..<3) { num in PreviewController(url: url) .tag(num) .frame(maxWidth: .infinity, maxHeight: .infinity) } } .tabViewStyle(.page(indexDisplayMode: .never)) } } }
内容的提问来源于stack exchange,提问作者JasonK
相关产品推荐
相关产品推荐

