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.
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
}
}