我正在构建一个非常简单的应用程序,它显示PDF文档。但是,如何知道PDF文档是什么时候渲染的呢?
下面是我的应用程序的样子:


现在,我有了一个在下载文档时显示的ProgressView。如何在下载并开始呈现文档时隐藏ProgressView?我在SwiftUI中完成了所有这些工作,我在一个SwiftUI应用程序中使用UIKit连接了PDFKit。现在,我该怎么做呢?我找到了这个,但这只适用于UIKit:How to know when a PDF is rendered using PDFKit
我的代码:
PDFRepresentedView:
import SwiftUI
import PDFKit
struct PDFRepresentedView: UIViewRepresentable {
typealias UIViewType = PDFView
let url: URL
let singlePage: Bool
init(_ url: URL, singlePage: Bool = false) {
self.url = url
self.singlePage = singlePage
}
func makeUIView(context _: UIViewRepresentableContext<PDFRepresentedView>) -> UIViewType {
let pdfView = PDFView()
pdfView.document = PDFDocument(url: url)
pdfView.autoScales = true
if singlePage {
pdfView.displayMode = .singlePage
}
return pdfView
}
func updateUIView(_ pdfView: UIViewType, context: UIViewRepresentableContext<PDFRepresentedView>) {
pdfView.document = PDFDocument(url: url)
}
}PDFReaderView:
import SwiftUI
struct PDFReaderView: View {
var url: URL
var body: some View {
ProgressView("pdf.downloading")
}
}
struct PDFReaderView_Previews: PreviewProvider {
static var previews: some View {
PDFReaderView(url: URL(string: "https://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19600300168/U/D19600168Lj.pdf")!)
}
}HomeView:
import SwiftUI
struct HomeView: View {
@AppStorage("needsAppOnboarding") private var needsAppOnboarding: Bool = true
var body: some View {
NavigationView {
List(deeds) { deed in
NavigationLink(destination: PDFReaderView(url: deed.url)) {
Text(deed.name)
}
}
.navigationTitle("title")
}
.sheet(isPresented: $needsAppOnboarding) {
OnboardingView()
}
}
}
struct HomeView_Previews: PreviewProvider {
static var previews: some View {
HomeView()
}
}发布于 2021-03-05 04:48:01
看起来比让PDFDocument自己加载数据更好的选择。然后,您可以对错误做出适当的响应,等等。
import PDFKit
import SwiftUI
import Combine
class DataLoader : ObservableObject {
@Published var data : Data?
var cancellable : AnyCancellable?
func loadUrl(url: URL) {
cancellable = URLSession.shared.dataTaskPublisher(for: url)
.map { $0.data }
.receive(on: RunLoop.main)
.sink(receiveCompletion: { (completion) in
switch completion {
case .failure(let failureType):
print(failureType)
//handle potential errors here
case .finished:
break
}
}, receiveValue: { (data) in
self.data = data
})
}
}
struct ContentView : View {
@StateObject private var dataLoader = DataLoader()
var body: some View {
VStack {
if let data = dataLoader.data {
PDFRepresentedView(data: data)
} else {
Text("Loading")
}
}.onAppear {
dataLoader.loadUrl(url: URL(string: "https://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19600300168/U/D19600168Lj.pdf")!)
}
}
}
struct PDFRepresentedView: UIViewRepresentable {
typealias UIViewType = PDFView
let data: Data
let singlePage: Bool = false
func makeUIView(context _: UIViewRepresentableContext<PDFRepresentedView>) -> UIViewType {
let pdfView = PDFView()
pdfView.document = PDFDocument(data: data)
pdfView.autoScales = true
if singlePage {
pdfView.displayMode = .singlePage
}
return pdfView
}
func updateUIView(_ pdfView: UIViewType, context: UIViewRepresentableContext<PDFRepresentedView>) {
pdfView.document = PDFDocument(data: data)
}
}在本例中,DataLoader负责从Data获取URL。请注意我在中留下的关于您可能会在哪里响应错误的注释。
回到主视图,除非有可用的Data,否则会显示“正在加载”,在这种情况下,现在显示的是PDFRepresentedView,它现在接受Data对象而不是URL。
https://stackoverflow.com/questions/66482420
复制相似问题