xcode 在Swift UI中上传和查看PDF时出现问题

dtcbnfnu  于 2023-06-24  发布在  Swift
关注(0)|答案(1)|浏览(82)
\[DocumentManager\] The view service did terminate with error: Error Domain=\_UIViewServiceErrorDomain Code=1 "(null)" UserInfo={Terminated=disconnect method}

我在选择文件后会出现上述错误。我在我的主应用程序中遇到了这个问题,所以我做了一个虚拟的,以防我的原始代码有一些问题,但我仍然得到了同样的错误。

以下是我的代码:

import SwiftUI
import PDFKit

struct ContentView: View {
@State private var isPickerPresented = false
@State private var selectedURL: URL?

    var body: some View {
        VStack {
            if let url = selectedURL {
                PDFKitRepresentedView(url: url)
            } else {
                Text("No PDF selected")
            }
            
            Button(action: {
                self.isPickerPresented = true
            }) {
                Text("Choose File")
            }
        }.sheet(isPresented: $isPickerPresented) {
            DocumentPickerViewControllerRepresentable() { url in
                self.selectedURL = url
            }
        }
    }

}

struct PDFKitRepresentedView: UIViewRepresentable {
let url: URL

    func makeUIView(context: Context) -> PDFView {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: url)
        return pdfView
    }
    
    func updateUIView(_ uiView: PDFView, context: Context) {
        uiView.document = PDFDocument(url: url)
    }

}

struct DocumentPickerViewControllerRepresentable: UIViewControllerRepresentable {
private let onPick: (URL) -\> Void

    init(onPick: @escaping (URL) -> Void) {
        self.onPick = onPick
    }
    
    func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
        let documentPickerController = UIDocumentPickerViewController(forOpeningContentTypes: [.pdf])
        documentPickerController.delegate = context.coordinator
        return documentPickerController
    }
    
    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {
        
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    final class Coordinator: NSObject, UIDocumentPickerDelegate {
        private let parent: DocumentPickerViewControllerRepresentable
        
        init(_ parent: DocumentPickerViewControllerRepresentable) {
            self.parent = parent
        }
        
        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            guard let url = urls.first else { return }
            parent.onPick(url)
        }
    }

}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

我试着直接使用Swift UI制作一个上传器,但由于这不起作用,我最终使用UIViewControllerRepresentable(),但遇到了同样的错误。我试着在网上寻找解决方案,但大多数要么已经过时,要么给了我同样的错误。

brgchamk

brgchamk1#

文档选取器

struct DocumentPickerView: UIViewControllerRepresentable {
    @Binding var selectedPDF: PDFDocument?

    class Coordinator: NSObject, UIDocumentPickerDelegate {
        @Binding var selectedPDF: PDFDocument?

        init(selectedPDF: Binding<PDFDocument?>) {
            _selectedPDF = selectedPDF
        }

        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            if let pickedURL = urls.first {
                let pdfDocument = PDFDocument(url: pickedURL)
                selectedPDF = pdfDocument
            }
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(selectedPDF: $selectedPDF)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<DocumentPickerView>) -> UIDocumentPickerViewController {
        let picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.pdf], asCopy: true)
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<DocumentPickerView>) {
        // No update needed
    }
}

使用工具包uiview

class PDFKitView: UIView {
    
    private lazy var pdfView: PDFView = {
        let view = PDFView()
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.displayMode = .singlePageContinuous
        view.autoScales = true
        return view
    }()
    
    func loadPDF(from docuemtn: PDFDocument) {
        pdfView.document = docuemtn
        addSubview(pdfView)
    }
}

UIViewRepresentable然后

struct PDFViewViewer: UIViewRepresentable {
    var doc: PDFDocument
    
    func makeUIView(context: Context) -> PDFKitView {
        let pdfView = PDFKitView()
        pdfView.loadPDF(from: doc)
        return pdfView
    }
    
    func updateUIView(_ uiView: PDFKitView, context: Context) {}
}

上传并查看PDF

struct ContentView: View {
    @State private var isShowingDocumentPicker = false
    @State private var selectedPDF: PDFDocument?

    var body: some View {
        VStack {
            Button("Select PDF") {
                isShowingDocumentPicker = true
            }
            .padding()
            .sheet(isPresented: $isShowingDocumentPicker) {
                DocumentPickerView(selectedPDF: $selectedPDF)
            }

            if let pdfDocument = selectedPDF {
                PDFViewViewer(doc: pdfDocument)
            } else {
                Text("No PDF selected")
            }
        }
    }
}

别忘了

import SwiftUI
import PDFKit
import MobileCoreServices // Required for UTType
import UniformTypeIdentifiers
import UIKit

相关问题