SwiftUI .fileImporter 在通过向下滑动关闭后无法再次显示

Posted

技术标签:

【中文标题】SwiftUI .fileImporter 在通过向下滑动关闭后无法再次显示【英文标题】:SwiftUI .fileImporter cannot show again after dismissing by swipe down 【发布时间】:2021-10-18 09:23:11 【问题描述】:

我在 SwiftUI 中使用 .fileImporter 修饰符在我的应用程序中导入 pdf 文件。我有几个问题。首先,数据加载速度很慢,并且经常无法加载并给出消息内部错误无法与帮助应用程序通信。

但主要问题是,如果模式视图通过向下滑动关闭,则无法再次呈现。大概是因为绑定 $showFileImporter 没有重置。如果按下取消按钮以将其关闭,则它可以正常工作。我不知道是否有强制它全屏来解决这个问题。

这是我的代码:

.fileImporter(isPresented: $showFileImporter, allowedContentTypes: [.pdf])  result in
        switch result 
        case .success(let url):
            url.startAccessingSecurityScopedResource()
            if let pDFDocument = PDFDocument(url: url) 
                if let data = pDFDocument.dataRepresentation() 
                    // handle data
                    
                
            
        case .failure(let error):
            print(error)
        
    

【问题讨论】:

【参考方案1】:

我可以确认我的 .fileImporter 也不会在向下滑动时重置 isPresented 绑定。可以确定的一种方法是将显示文件导入器的按钮从$showFileImporter = true 更改为$showFileImporter.toggle()。在滑动关闭文件导入器时,您必须按两次按钮才能再次呈现。

不幸的是,这似乎是另一个半生不熟的 SwiftUI 事情,但我确实找到了一个合适的解决方法 - 使用演示按钮本身来处理这种情况:

Button(action: 
if showFileImporter 
    // NOTE: Fixes broken fileimporter sheet not resetting on swipedown
    showFileImporter = false
    DispatchQueue.main.asyncAfter(deadline: .now()+0.2, execute: 
        showFileImporter = true
    )
 else 
    showFileImporter = true

, label:  ... )

我尝试连续调用 .toggle() 两次,但需要稍微延迟触发器才能注册。

编辑: 我还注意到你没有打电话给url.stopAccessingSecurityScopedResource(),你应该在打电话给你的pDFDocument之后这样做。

【讨论】:

这是一种临时解决方法。并添加了 stopAccessingSecurityScopedResource()。谢谢。

以上是关于SwiftUI .fileImporter 在通过向下滑动关闭后无法再次显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?

SwiftUI,如何在拖动后立即通过代码停止列表滚动?

如何通过 SwiftUI 按钮在 UIViewController 中执行功能?

如何通过 swiftUI 制作 2048 游戏 [关闭]

在 Swiftui 中是不是有一种简单的方法可以通过捏合来放大图像?

SwiftUI - 如何通过视图模型完成调用函数