【问题标题】:How can I open a local PDF file using a SwiftUI button?如何使用 SwiftUI 按钮打开本地 PDF 文件?
【发布时间】:2020-04-28 10:43:30
【问题描述】:

我想在点击按钮时通过新视图显示本地 PDF 文件。 我尝试使用 UIViewRepresentable WebView 执行此操作,但它不起作用(我仅通过 NavigationList 使用 WebView)。

我留下了我的代码,但如果 WebView 不是最佳选择,请随时提出更好的选择。

按钮视图

import SwiftUI

struct ResumeView: View {

    let sfSymbol: String
    let text: String

    let fileUrl = Bundle.main.path(forResource: "Resume", ofType: "pdf")

    var body: some View {
        RoundedRectangle(cornerRadius: 25)
            .fill(Color.white)
            .frame(height: 50.0)
            .overlay(
                HStack {
                    Image(systemName: sfSymbol)
                        .foregroundColor(.init(red: 0.20, green: 0.33, blue: 0.55, opacity: 1.00))
                    Button(action: {
                        WebView(urlString: self.fileUrl)
                    }) {
                    Text(text)
                        .foregroundColor(.black)
                    }
            })
    }
}

网络视图

import Foundation
import SwiftUI
import WebKit 

struct WebView: UIViewRepresentable {

    let urlString: String?

    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {
        if let safeUrlString = urlString {
            if let url = URL(string: safeUrlString) {
                let request = URLRequest(url: url)
                uiView.load(request)
            }
        }
    }
}

【问题讨论】:

  • Slaine06,显然您的问题的答案对您不起作用,但您自己设法提出了解决方案(使用工作表)。对于我们这些正在为“如何使用 SwiftUI 按钮打开本地 PDF 文件?”而苦苦挣扎的人,您愿意分享您的解决方案的代码吗?在 StackOverflow 上,您可以回答自己的问题 - 为面临相同问题的未来开发人员提供帮助。谢谢。

标签: ios swift pdf webview swiftui


【解决方案1】:

使用 PDFKit 我们加载本地 PDF 文件。请尝试以下代码。

import SwiftUI
struct ResumeView: View {
    ....
    let fileUrl = Bundle.main.url(forResource: "Resume", withExtension: "pdf")!
    var body: some View {
        ....
        Button(action: {
            PDFKitView(url: self.fileUrl)
        }) {
            Text(text)
                .foregroundColor(.black)
        }
        ....
    }
}

PDFKitView

import PDFKit
struct PDFKitView: View {
    var url: URL
    var body: some View {
        PDFKitRepresentedView(url)
    }
}

struct PDFKitRepresentedView: UIViewRepresentable {
    let url: URL
    init(_ url: URL) {
        self.url = url
    }

    func makeUIView(context: UIViewRepresentableContext<PDFKitRepresentedView>) -> PDFKitRepresentedView.UIViewType {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: self.url)
        pdfView.autoScales = true
        return pdfView
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFKitRepresentedView>) {
        // Update the view.
    }
}

【讨论】:

  • 仅使用该代码我没有收到任何错误,但视图没有显示自己。所以我查找了在 SwiftUI 中以模态方式显示视图的方法。我用工作表解决了。仍然让我能够解决我的问题,非常感谢。
【解决方案2】:

要在应用中打开 pdf,您必须这样做:

struct PDFKitRepresentedView: UIViewRepresentable {

    func makeUIView(context: UIViewRepresentableContext<PDFKitRepresentedView>) -> PDFKitRepresentedView.UIViewType {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: getDocumentsDirectory().appendingPathComponent("earth.pdf"))
        pdfView.autoScales = true
        
        return pdfView
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFKitRepresentedView>) {
        // EMPTY!
    }
}

并且,在哪里使用 PDFKitRepresentedView(),下面的例子

VStack {
    pdfView
    Button {} label: {Text("Test")}
}

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多