SwiftUI中PDFView随documentURL变更不更新的问题求助
SwiftUI PDF阅读器切换文件不更新视图的解决方法
问题背景
开发SwiftUI简易PDF阅读器时,首次通过fileImporter选择PDF文件能正常显示,但切换其他PDF时,仅navigationTitle更新,PDF内容完全没变化,@EnvironmentObject的变更未同步到PDF视图。
问题原因
UIViewRepresentable的makeUIView仅在视图初始化时调用一次,而你实现的PDFKitView中updateUIView方法是空的——当传入的documentURL变化时,没有更新已创建的PDFView的文档内容,导致视图不刷新。
另外需要确认:你的File类必须是ObservableObject,且url、name属性标记为@Published,否则@EnvironmentObject的变更无法触发SwiftUI视图更新。
解决方案
1. 完善PDFKitView的updateUIView方法
在updateUIView中检测documentURL的变化,更新PDFView的文档:
struct PDFKitView: UIViewRepresentable { var documentURL: URL? func makeUIView(context: Context) -> PDFView { let pdfView = PDFView() pdfView.autoScales = true pdfView.displayDirection = .vertical // 初始化时设置初始文档 if let url = documentURL { pdfView.document = PDFDocument(url: url) } return pdfView } func updateUIView(_ uiView: PDFView, context: Context) { // 当URL变化时更新PDF文档,避免重复设置 guard let url = documentURL, uiView.document?.documentURL != url else { return } uiView.document = PDFDocument(url: url) } }
2. 确保File类符合ObservableObject要求
import Combine class File: ObservableObject { @Published var url: URL? @Published var name: String = "" }
3. 确认视图层级注入EnvironmentObject
在ContentView的父视图(比如App结构体或根视图)中注入File对象:
@main struct PDFToSpeachApp: App { @StateObject private var file = File() var body: some Scene { WindowGroup { ContentView() .environmentObject(file) } } }
验证
修改后再次通过fileImporter选择不同PDF文件,PDFView会同步更新显示新文件内容,navigationTitle也会正常变化。
内容的提问来源于stack exchange,提问作者DawPac
相关产品推荐
相关产品推荐

