xcode 如何在SwiftUI应用程序中实现PDF Viewer?

xdnvmnnf  于 12个月前  发布在  Swift
关注(0)|答案(2)|浏览(150)

我正在构建一个显示PDF的应用程序,但我不知道如何使用SwiftUI显示PDF文件。我找到了如何使用UIKit显示PDF文件的教程,但没有关于SwiftUI的教程。有人可以帮助我吗?
我也在尝试使用MVVM设计模式。如果有人能帮助我,我将非常感激!
x1c 0d1x的数据


编码:

HomeView.swift

import SwiftUI

struct HomeView: View {
    
    var deeds: [Deed] = deedsData
    
    var body: some View {
        NavigationView {
                List(deeds) { item in
                    Button(action: {
                        
                    }) {
                        HStack {
                            Image(systemName: "doc.fill")
                            Text(item.title)
                        }
                    }
                }
                .navigationTitle("title")
        }
    }
}

struct HomeView_Previews: PreviewProvider {
    static var previews: some View {
        HomeView(deeds: deedsData)
    }
}

字符串

DeedModel.swift

import SwiftUI

struct Deed: Identifiable {
    var id = UUID()
    var title: String
    var URL: String
}

let deedsData: [Deed] = [
    Deed(title: NSLocalizedString("civilCode", comment: "Civil code"), URL: "https://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19640160093/U/D19640093Lj.pdf"),
    Deed(title: NSLocalizedString("penalCode", comment: "Penal code"), URL: "https://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19970880553/U/D19970553Lj.pdf"),
    Deed(title: NSLocalizedString("civilProcedureCode", comment: "Code of civil procedure"), URL: "https://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19640430296/U/D19640296Lj.pdf"),
    Deed(title: NSLocalizedString("familyAndGuardianshipCode", comment: "Family and guardianship code"), URL: "http://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19640090059/U/D19640059Lj.pdf"),
    Deed(title: NSLocalizedString("laborCode", comment: "Labor code"), URL: "https://isap.sejm.gov.pl/isap.nsf/download.xsp/WDU19740240141/U/D19740141Lj.pdf"),
]


有谁知道如何在MVVM模式中做到这一点?

tf7tbtn2

tf7tbtn21#

要使用仅限Apple的框架显示PDF,您需要通过UIViewRepresentable使用UIKit:

import PDFKit
import SwiftUI

struct PDFKitRepresentedView: UIViewRepresentable {
    typealias UIViewType = PDFView

    let data: Data
    let singlePage: Bool

    init(_ data: Data, singlePage: Bool = false) {
        self.data = data
        self.singlePage = singlePage
    }

    func makeUIView(context _: UIViewRepresentableContext<PDFKitRepresentedView>) -> UIViewType {
        // Create a `PDFView` and set its `PDFDocument`.
        let pdfView = PDFView()
        pdfView.document = PDFDocument(data: data)
        pdfView.autoScales = true
        if singlePage {
            pdfView.displayMode = .singlePage
        }
        return pdfView
    }

    func updateUIView(_ pdfView: UIViewType, context _: UIViewRepresentableContext<PDFKitRepresentedView>) {
        pdfView.document = PDFDocument(data: data)
    }
}

字符串
然后PDFKitRepresentedView可以在你的视图层次结构中使用。
这需要一个Data对象作为输入,所以你需要先通过网络调用将这些URL对象转换为Data。所以,你可以这样做:

@State var data : Data? 

...

.onAppear {
  self.data = try? Data(contentsOf: url)
}


请记住,这是大大简化-你会想做一些错误处理,等等可能想做一些搜索SwiftUI网络调用。

0aydgbwb

0aydgbwb2#

自iOS 14以来,有一些不错的视图修改器可用:.quickLookPreview($url)

@State var url: URL?
Button("PDF preview") {
  url = Bundle.main.url(forResource: "mypdfdocument", withExtension: "pdf")
}
 .quickLookPreview($url)

字符串

相关问题