swift - QLPreviewController 在 SwiftUI 中缺少导航栏

标签 swift xcode swiftui uinavigationbar qlpreviewcontroller

当我在工作表中显示时,缺少 QLPreviewController 导航栏。 看起来像这样:Image 如何显示顶部导航栏或 navigationItem?

可在 swiftUI 中表示的 QuickLookController UIKit

.sheet(isPresented: $showQuickLook, onDismiss: {self.showQuickLook = false}) {
                        if  self.selectedURL != nil {
                            QuickLookController(url: self.selectedURL!) {
                                self.showQuickLook = false
                            }.edgesIgnoringSafeArea(.all)
                        }
                    }


struct QuickLookController: UIViewControllerRepresentable {

    var url: URL
    var onDismiss: () -> Void

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func updateUIViewController(_ uiViewController: QLPreviewController, context: UIViewControllerRepresentableContext<QuickLookController>) {
        uiViewController.reloadData()
    }

    func makeUIViewController(context: Context) -> QLPreviewController {
        let controller = QLPreviewController()

        controller.dataSource = context.coordinator
        controller.reloadData()
        return controller
    }

    class Coordinator: NSObject, QLPreviewControllerDataSource {
        var parent: QuickLookController

        init(_ qlPreviewController: QuickLookController) {
            self.parent = qlPreviewController
            super.init()
        }
        func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
            return 1
        }
        func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
            return self.parent.url as QLPreviewItem
        }

    }
}

最佳答案

QuickLook 预览没有自己的导航 Controller ,我们有责任提供一个。

这是可能的方法。使用 Xcode 11.4/iOS 13.4 测试

demo

struct TestQLPreviewController: View {
    @State private var showQuickLook = false

    // just for demo - document.pdf is located in main bundle
    @State private var selectedURL = Bundle.main.url(forResource: "document", withExtension: "pdf")
    var body: some View {
        Button("Show") { self.showQuickLook.toggle() }
            .sheet(isPresented: $showQuickLook, onDismiss: {self.showQuickLook = false}) {
                                    if  self.selectedURL != nil {
                                        QuickLookController(url: self.selectedURL!) {
                                            self.showQuickLook = false
                                        }
                                    }
                                }
    }
}


struct QuickLookController: UIViewControllerRepresentable {

    var url: URL
    var onDismiss: () -> Void

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func updateUIViewController(_ viewController: UINavigationController, context: UIViewControllerRepresentableContext<QuickLookController>) {
        if let controller = viewController.topViewController as? QLPreviewController {
            controller.reloadData()
        }
    }

    func makeUIViewController(context: Context) -> UINavigationController {
        let controller = QLPreviewController()

        controller.dataSource = context.coordinator
        controller.reloadData()
        return UINavigationController(rootViewController: controller)
    }

    class Coordinator: NSObject, QLPreviewControllerDataSource {
        var parent: QuickLookController

        init(_ qlPreviewController: QuickLookController) {
            self.parent = qlPreviewController
            super.init()
        }
        func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
            return 1
        }
        func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
            return self.parent.url as QLPreviewItem
        }

    }
}

关于swift - QLPreviewController 在 SwiftUI 中缺少导航栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61357888/

相关文章:

ios - 为什么我不能在 xcode 6.1 中使用 show segue?

ios - 超过最大文本 ("") 连接长度 - SwiftUI -

ios - 如何设置每次按下 *addMoreCredits* - 按钮时都会从 *usersCredits* 中减去 1

swift - 如何在完成处理程序中显示编程 View ?

ios - 在 Xcode 项目清理构建文件夹后,Images.xcassets 停止工作 - iOS

ios - Xcode UI 测试目标中禁用的记录按钮

swift - 在 Swift 中打开关闭的 NSWindow 会使应用程序崩溃

swiftui - 如何使用 NavigationLink 在列表行中拥有其他可选区域?

ios - 应用程序被杀死时点击推送通知后应用程序崩溃

ios - 在将数组发送到 API 端点之前序列化数组