首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道PDF文件何时在PDFKit中下载?

如何知道PDF文件何时在PDFKit中下载?
EN

Stack Overflow用户
提问于 2021-03-05 04:18:47
回答 1查看 40关注 0票数 0

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

下面是我的应用程序的样子:

现在,我有了一个在下载文档时显示的ProgressView。如何在下载并开始呈现文档时隐藏ProgressView?我在SwiftUI中完成了所有这些工作,我在一个SwiftUI应用程序中使用UIKit连接了PDFKit。现在,我该怎么做呢?我找到了这个,但这只适用于UIKit:How to know when a PDF is rendered using PDFKit

我的代码:

PDFRepresentedView:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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()
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-05 04:48:01

看起来比让PDFDocument自己加载数据更好的选择。然后,您可以对错误做出适当的响应,等等。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66482420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档