如何使用 SwiftUI 按钮打开本地 PDF 文件?
How can I open a local PDF file using a SwiftUI button?
我想在点击按钮时通过新视图显示本地 PDF 文件。
我尝试使用 UIViewRepresentable WebView 这样做,但它不起作用(我只通过 NavigationList 使用 WebView)。
我留下我的代码,但如果 WebView 不是最佳选择,请随时提出更好的选择。
ButtonView
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)
}
})
}
}
WebView
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)
}
}
}
}
我们使用 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.
}
}
要在应用程序中打开 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")}
}
我想在点击按钮时通过新视图显示本地 PDF 文件。 我尝试使用 UIViewRepresentable WebView 这样做,但它不起作用(我只通过 NavigationList 使用 WebView)。
我留下我的代码,但如果 WebView 不是最佳选择,请随时提出更好的选择。
ButtonView
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)
}
})
}
}
WebView
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)
}
}
}
}
我们使用 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.
}
}
要在应用程序中打开 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")}
}