为什么我无法在 macOS 中使用 PDFKit 查看 PDF 文件的内容?

问题描述 投票:0回答:1

我正在尝试使用 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 文件后的屏幕截图

截图

macos swiftui pdfkit
1个回答
0
投票

在当前代码中,您仅在

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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.