Невозможно перезагрузить / повторно отобразить PDF в WKWebView; но RTF, по-видимому, работает

#pdf #swiftui #webkit

#PDF #swiftui #webkit

Вопрос:

Сценарий: TabbedUI с вкладкой # 1, являющейся WKWebView, отображает PDF с общей информацией (Info).

Проблема: когда я выхожу из вкладки # 1 (информация) для другой вкладки (например, поиск) и возвращаюсь….Я получаю пустой PDF-файл со следующим сообщением об ошибке в консоли:

введите описание изображения здесь

Не удалось передать сигнал службе com.apple.WebKit.WebContent: 113: не удалось найти указанную службу

Однако этого не происходит, когда я использую стандартный файл .rtf (формат Rich Text).

Вот мой код:

 import SwiftUI
import WebKit

struct IntroSwiftUI: View {

    var body: some View {
        Webview()
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .edgesIgnoringSafeArea(.bottom)
    }

}

// =====================================================================================================

struct Webview: UIViewRepresentable {
    func makeUIView(context: Context) -> WKWebView {
        guard let url = Bundle.main.url(forResource: "ReadMe", withExtension: "pdf") else {
            print("Inside Webview: unable to reload ReadMe.")
            return WKWebView()
        }
        let request = URLRequest(url: url)
        let wkWebview = WKWebView()
        wkWebview.load(request)
        wkWebview.scrollView.bounces = false

        return wkWebview
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
    }
}
  

Я просто хочу, чтобы статический PDF-файл был доступен для просмотра всякий раз, когда пользователь хочет прочитать некоторую документацию (со встроенными изображениями). Но, по-видимому, он пытается перестроиться и теряется.

Нужно ли мне делать что-то «особенное» с PDF-файлом, например, выпускать его при выходе и воссоздавать его по возвращении?
Это кажется совершенно неэффективным.

Комментарии:

1. Почему вы не используете PDFView для отображения pdf? Я никогда не сталкивался с такой проблемой с PDFView

2. Я, честно говоря, забыл о PDFView. Спасибо.

Ответ №1:

Согласно предложению,
используйте парадигму PDFView.

Вот мой пересмотренный (правильный) код для просмотра PDF:

 import SwiftUI
import UIKit
import PDFKit

struct PDFKitRepresentedView: UIViewRepresentable {
    let url: URL

    init(_ url: URL) {
        self.url = url
    }

    func makeUIView(context: UIViewRepresentableContext<PDFKitRepresentedView>) -> PDFKitRepresentedView.UIViewType {
        // Create a `PDFView` and set its `PDFDocument`.
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: self.url)
        return pdfView
    }

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

struct PDFKitView: View {
    var url: URL

    var body: some View {
        PDFKitRepresentedView(url)
    }
}

// =====================================================================================================

struct IntroSwiftUI: View {
    var body: some View {
        if let documentURL = Bundle.main.url(forResource: "ReadMe", withExtension: "pdf") {
        VStack(alignment: .center) {
            Text("Introduction")
                .font(.title3)
                .fontWeight(Font.Weight.medium)
            PDFKitView(url: documentURL)
        }
        } else {
            Text("Sorry, No PDF")
        }
    }
}