前提・実現したいこと
firebaseのstorageに保存したPDFデータ、swiftUIで表示したい。
発生している問題・エラーメッセージ
エラーメッセージはなくビルトは成功します。ただし、PDFビューが空のままです。
該当のソースコード
import SwiftUI import Firebase import FirebaseStorage import PDFKit class PDFInfo_Mathmatics: ObservableObject { @Published var pageNo: Int = 1 @Published var pdfView: PDFView = PDFView() @Published var stateTopButton: Bool = false func addObserver() { NotificationCenter.default.addObserver(self, selector: #selector(self.pageChanged(_:)), name: Notification.Name.PDFViewPageChanged, object: nil) } @objc func pageChanged(_ notification: Notification) { pageNo = pdfView.currentPage!.pageRef!.pageNumber stateTopButton = pdfView.canGoToFirstPage print(self.pageNo) print("page is changed") } } struct ShowPDFView: View { @ObservedObject var pdfInfo: PDFInfo_Mathmatics var body: some View { PDFViewer(pdfInfo: pdfInfo) } } struct PDFViewer: UIViewRepresentable { @ObservedObject var pdfInfo: PDFInfo_Mathmatics @ObservedObject var Firebase = firebase() @ObservedObject var pdfDocument = downloadImage() var url: URL { return Firebase.url ?? Bundle.main.url(forResource: "SampleData2", withExtension: "pdf")! } func makeUIView(context: UIViewRepresentableContext<PDFViewer>) -> PDFViewer.UIViewType { pdfInfo.pdfView.autoScales = true pdfInfo.pdfView.usePageViewController(true) pdfInfo.pdfView.displayDirection = .vertical pdfDocument.PDFdownload() pdfInfo.pdfView.document = pdfDocument.pdfDate return pdfInfo.pdfView } func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFViewer>) { } } struct PdfInfoView: View { @ObservedObject var pdfInfo: PDFInfo_Mathmatics @State var enableTopButton: Bool = true var body: some View { HStack{ Text(String(pdfInfo.pageNo)) // ボタンの状態を変えてクリック無効にする場合はこちら Button(action: { pdfInfo.pdfView.goToFirstPage(self) }, label: { Text("TOP") }) .disabled(!pdfInfo.stateTopButton) } } } class downloadImage: ObservableObject{ let PDFRef = Storage.storage().reference().child("MathmaticsSampleData/SampleData.pdf") @Published var pdfDate: PDFDocument = PDFDocument() func PDFdownload() { PDFRef.getData(maxSize: 82858620){date , error in if error != nil{ print("error") }else{ self.pdfDate = PDFDocument(data: date!)! } } } } struct PDFTests6: View { @ObservedObject var object = downloadImage() @ObservedObject var pdfInfo: PDFInfo_Mathmatics = PDFInfo_Mathmatics() var body: some View { VStack { ShowPDFView(pdfInfo: pdfInfo) PdfInfoView(pdfInfo: pdfInfo) .padding() Button("Tap me!"){ self.object.PDFdownload() } } .onAppear(){ pdfInfo.addObserver() } } } struct PDFTests6_Previews: PreviewProvider { static var previews: some View { PDFTests6() } }
試したこと
間にprint関数を挟んで、firebaseと通信できるかや、PDFDocumentが存在するか確認した。
PDFViewer の updateUIView の引数 uiView の型を PDFView にして、uiView.document を更新すると良いかも。
あなたの回答
tips
プレビュー