访问 @Environment(\.presentationMode) 阻止 PDFView 出现

Posted

技术标签:

【中文标题】访问 @Environment(\\.presentationMode) 阻止 PDFView 出现【英文标题】:Accessing @Environment(\.presentationMode) stopping PDFView from appearing访问 @Environment(\.presentationMode) 阻止 PDFView 出现 【发布时间】:2020-12-20 18:05:43 【问题描述】:

问题:访问@Environment(.presentationMode) 会阻止显示我的PDFView。

工作代码:在 MainView 中通过 PDFViewer 显示 pdf 文档

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:不显示文档也不显示 PDFViewer(唯一的变化是访问@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
    

问题:任何人都可以解释为什么访问这个环境变量似乎会阻止子视图(pdfviewer)出现在主视图中吗?我知道 PDFViewer 正在初始化,因为当它接收到数据时我仍然会收到更新调用。

我的计划是使用presentationMode以编程方式弹出视图。

提前致谢。

【问题讨论】:

【参考方案1】:

尝试如下更改PDFViewer

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
    

【讨论】:

完美。那是有效的。我不明白为什么旧版本不起作用?为什么指定返回类型会有所不同? 在你的情况下 PDFView 被重新创建,在我的 - 不是..

以上是关于访问 @Environment(\.presentationMode) 阻止 PDFView 出现的主要内容,如果未能解决你的问题,请参考以下文章

我如何在swiftui中从我的应用程序中的任何视图访问这个:@Environment(\.managedObjectContext) var context? [关闭]

js跨域访问,No 'Access-Control-Allow-Origin' header is present on the requested resource

关闭工作表 SwiftUI

jQuery 跨域访问的三种方式 No 'Access-Control-Allow-Origin' header is present on the reque

浏览器禁止跨域访问及解决: No 'Access-Control-Allow-Origin' header is present on the requested resource.

如何在 React Native 中访问、更新和保存数组索引?