我正在尝试使用 PDFKit 和 NSViewRepresentable 包装器显示 pdf 文件
以下代码显示灰框,而不是所选 pdf 文件的内容
import SwiftUI
import AppKit
import PDFKit
struct ContentView: View {
@State var pdfURL: URL? = nil
var body: some View {
VStack {
Button {
let panel = NSOpenPanel()
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
if panel.runModal() == .OK {
if let src = panel.url {
pdfURL = src
}
}
} label: {
Text("Pick a PDF file")
}
PDFKitView(url: pdfURL)
.scaledToFit()
}
.padding()
}
}
#Preview {
ContentView()
}
struct PDFKitView: NSViewRepresentable {
let url: URL?
func makeNSView(context: NSViewRepresentableContext<PDFKitView>) -> PDFView{
let pdfView = PDFView()
if let url = url {
pdfView.document = PDFDocument(url: url)
}
return pdfView
}
func updateNSView(_ nsView: PDFView, context: NSViewRepresentableContext<PDFKitView>) {
}
}
我不知道我做错了什么。 这是选择 pdf 文件后的屏幕截图
在当前代码中,您仅在
document
期间在 PDFView
上设置 makeNSView
,此时 url
为 nil
。
相反,您可以将
document
设置代码移至 updateNSView
,当 url
参数更改时(以及 makeNSView
之后的初始加载)会调用该代码。
struct PDFKitView: NSViewRepresentable {
let url: URL?
func makeNSView(context: NSViewRepresentableContext<PDFKitView>) -> PDFView{
PDFView()
}
func updateNSView(_ pdfView: PDFView, context: NSViewRepresentableContext<PDFKitView>) {
if let url = url {
pdfView.document = PDFDocument(url: url)
}
}
}