swift 当documentURL更改时,PDFView不更新

wljmcqd8  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(131)

我尝试在swiftui中制作简单的pdf查看器。当我第一次使用fileImporter选择pdf时,它会显示,但当我这样做一段时间后,即使.navigationTitle改变,它也不会改变。我应该在@EnvironmentObject改变时改变。这可能是非常简单的,但我找不到任何好的好教程,为这种情况。
这是我的PDFView

//
//  CustomPDFView.swift
//  PDFToSpeach
//
//  Created by Dawid Paćkowski on 13/06/2023.
//

import SwiftUI
import PDFKit

struct CustomPDFView: View {
    @EnvironmentObject var file: File

    var body: some View {
        VStack {
            NavigationView {
                PDFKitView(documentURL: file.url)
                    .navigationTitle(file.name)
            }
        }
    }
}

struct PDFKitView:UIViewRepresentable{
    var documentURL: URL?
    
    
    func makeUIView(context: Context) -> some UIView {
        let pdfView: PDFView = PDFView()
        
        pdfView.document = PDFDocument(url: self.documentURL!)
        pdfView.autoScales = true
        pdfView.displayDirection = .vertical

        return pdfView
    }
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
}

我在ContentView.swift中这样修改@EnvironmentObject

.fileImporter(isPresented: $openFile, allowedContentTypes: [UTType.pdf]) { result in
            do {
                let fileURL = try result.get()
                file.url = fileURL
                file.name = fileURL.lastPathComponent
            } catch {
                print(error)
            }
        }
92vpleto

92vpleto1#

我认为当调用updateUIView方法时,需要更新PDFKitView中的PDFView,SwiftUI在更新视图时会调用该方法
下面是修改后的PDFKitView。另外,我还增加了一些改进,比如检查nil以避免崩溃

struct PDFKitView: UIViewRepresentable {
    var documentURL: URL?

    func makeUIView(context: Context) -> PDFView {
        let pdfView: PDFView = PDFView()
        // check if url exists then set a new document
        if let documentURL {
            pdfView.document = PDFDocument(url: documentURL)
        }
        pdfView.autoScales = true
        pdfView.displayDirection = .vertical
        return pdfView
    }

    func updateUIView(_ uiView: PDFView, context: Context) {
        // take the updated document url and apply
        // check if url exists then set a new document
        if let documentURL {
            uiView.document = PDFDocument(url: documentURL)
        } else {
            uiView.document = nil // clear the document in case if url is nil
        }
    }
}

它基本上接受新文档的url,用它创建一个新的PDFDocument,并将其设置为pdfView(可以在updateUIView中使用uiView参数访问它(确保在makeUIView中返回相同的类型,在这种情况下它必须返回PDFView)),就像在makeUIView中一样
还要确保修改File对象会触发视图更新

相关问题