我尝试在swiftui中制作简单的pdf查看器。当我第一次使用fileImporter选择pdf时,它会显示,但当我这样做一段时间后,即使.navigationTitle改变,它也不会改变。我应该在@EnvironmentObject
改变时改变。这可能是非常简单的,但我找不到任何好的好教程,为这种情况。
这是我的PDFView
//
// CustomPDFView.swift
// PDFToSpeach
//
// Created by Dawid Paćkowski on 13/06/2023.
//
import SwiftUI
import PDFKit
struct CustomPDFView: View {
@EnvironmentObject var file: File
var body: some View {
VStack {
NavigationView {
PDFKitView(documentURL: file.url)
.navigationTitle(file.name)
}
}
}
}
struct PDFKitView:UIViewRepresentable{
var documentURL: URL?
func makeUIView(context: Context) -> some UIView {
let pdfView: PDFView = PDFView()
pdfView.document = PDFDocument(url: self.documentURL!)
pdfView.autoScales = true
pdfView.displayDirection = .vertical
return pdfView
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
我在ContentView.swift
中这样修改@EnvironmentObject
.fileImporter(isPresented: $openFile, allowedContentTypes: [UTType.pdf]) { result in
do {
let fileURL = try result.get()
file.url = fileURL
file.name = fileURL.lastPathComponent
} catch {
print(error)
}
}
1条答案
按热度按时间92vpleto1#
我认为当调用
updateUIView
方法时,需要更新PDFKitView
中的PDFView
,SwiftUI在更新视图时会调用该方法下面是修改后的
PDFKitView
。另外,我还增加了一些改进,比如检查nil以避免崩溃它基本上接受新文档的url,用它创建一个新的
PDFDocument
,并将其设置为pdfView(可以在updateUIView
中使用uiView
参数访问它(确保在makeUIView
中返回相同的类型,在这种情况下它必须返回PDFView
)),就像在makeUIView
中一样还要确保修改
File
对象会触发视图更新