Accessing @Environment(\.presentationMode) stopping PDFView from appearing

95 views Asked by At

Problem: Accessing @Environment(.presentationMode) stops my PDFView from being shown.

Working Code: Displays a pdf document via PDFViewer within MainView

import SwiftUI

struct MainView: View {

    @State var pdfDocument: PDFDocument = PDFDocument()

    var body: some View {

        VStack {

            PDFViewer(pdfDocument: $pdfDocument)
        }
    }
}

import SwiftUI
import PDFKit

struct PDFViewer UIViewRepresentable {

    @Binding var pdfDocument: PDFDocument
    let pdfView = PDFView()

    func makeUIView(context: Context) -> some UIView {
        pdfView.document = pdfDocument
        pdfView.autoScales = true
        return pdfView
    }

    func updateUIView(_ uiView: UIViewType, context: Context) {
        print("update view called")
        pdfView.document = pdfDocument
    }
}

Broken Code: Doesnt display the document nor PDFViewer (only change is accessing @Environment)

import SwiftUI

struct MainView: View {

    @Environment(\.presentationMode) var presentationMode

    @State var pdfDocument: PDFDocument = PDFDocument()

    var body: some View {

        VStack {

            PDFViewer(pdfDocument: $pdfDocument)
        }
    }
}

import SwiftUI
import PDFKit

struct PDFViewer UIViewRepresentable {

    @Binding var pdfDocument: PDFDocument
    let pdfView = PDFView()

    func makeUIView(context: Context) -> some UIView {
        pdfView.document = pdfDocument
        pdfView.autoScales = true
        return pdfView
    }

    func updateUIView(_ uiView: UIViewType, context: Context) {
        print("update view called")
        pdfView.document = pdfDocument
    }
}

Question: Can anyone shed any light as to why accessing this environment varible appears to be stopping the childview (pdfviewer) from appearing in the main view? I know that PDFViewer is being initalised because I still get update calls when it receives data.

My plan is to use the presentationMode to pop the view programmatically.

Thanks in advance.

1

There are 1 answers

2
Asperi On BEST ANSWER

Try to change PDFViewer as follows

struct PDFViewer: UIViewRepresentable {

    @Binding var pdfDocument: PDFDocument

    func makeUIView(context: Context) -> PDFView {
        let pdfView = PDFView()
        pdfView.document = pdfDocument
        pdfView.autoScales = true
        return pdfView
    }

    func updateUIView(_ uiView: PDFView, context: Context) {
        print("update view called")
        uiView.document = pdfDocument
    }
}