swiftui - 如何在 macOS 上使用 SwiftUI 显示 QLPreviewPanel?
问题描述
试图弄清楚如何在 iOS 和 macOS 上的 SwiftUI 中使用 QuickLook。我怀疑在不久的将来,会有一些统一的 SwiftUI QL API,但还看不到,所以让我们用我们现有的......</p>
如何从我的 SwiftUI 视图中呈现和配置 QLPreviewPanel?到目前为止,我有这个:
struct ItemView: View {
let previewPanelThing = PreviewPanelThing()
var body: some View {
Button("OSX preview") {
print("osx preview")
if let previewPanel = QLPreviewPanel.shared() {
self.previewPanelThing.updateControllerForPanel(previewPanel)
previewPanel.makeKeyAndOrderFront(self.previewPanelThing)
}
}
}
}
class PreviewPanelThing: QLPreviewPanelDataSource {
func updateControllerForPanel(_ panel: QLPreviewPanel) {
print("updating controller")
panel.updateController()
}
func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
print("number of items")
return 1
}
func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
print("requesting preview item")
let fileURL: URL = Bundle.main.url(forResource: "Thinking-of-getting-a-cat", withExtension: "png")!
return fileURL as QLPreviewItem
}
}
这是行不通的。我怀疑这是因为 QLPreviewPanel 文档说:The preview panel follows the responder chain and adapts to the first responder willing to control it.
我的previewPanelThing
实例不在 UI 和响应者链中。我不确定响应者链在 SwiftUI 中是如何工作的,以及如何最好地处理它。
解决方案
这是直接用于预览 PDF 文件的可能方法QLPreviewView
(在此演示中存储在主应用程序包中,但这不会改变常见的想法)
更新:添加了QLPreviewPanel
单击按钮的变体
import SwiftUI
import AppKit
import Quartz
func loadPreviewItem(with name: String) -> NSURL {
let file = name.components(separatedBy: ".")
let path = Bundle.main.path(forResource: file.first!, ofType: file.last!)
let url = NSURL(fileURLWithPath: path!)
return url
}
struct MyPreview: NSViewRepresentable {
var fileName: String
func makeNSView(context: NSViewRepresentableContext<MyPreview>) -> QLPreviewView {
let preview = QLPreviewView(frame: .zero, style: .normal)
preview?.autostarts = true
preview?.previewItem = loadPreviewItem(with: fileName) as QLPreviewItem
return preview ?? QLPreviewView()
}
func updateNSView(_ nsView: QLPreviewView, context: NSViewRepresentableContext<MyPreview>) {
}
typealias NSViewType = QLPreviewView
}
struct ContentView: View {
let qlCoordinator = QLCoordinator()
var body: some View {
// example.pdf is expected in app bundle resources
VStack {
MyPreview(fileName: "example.pdf")
Divider()
Button("Show panel") {
let panel = QLPreviewPanel.shared()
panel?.center()
panel?.dataSource = self.qlCoordinator
panel?.makeKeyAndOrderFront(nil)
}
}
}
class QLCoordinator: NSObject, QLPreviewPanelDataSource {
func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
return loadPreviewItem(with: "example.pdf") as QLPreviewItem
}
func numberOfPreviewItems(in controller: QLPreviewPanel) -> Int {
return 1
}
}
}
推荐阅读
- php - 使用 php 中的链接下载 html 文件
- java - 客户端服务器连接错误从 CMD 运行客户端类,但使用 netcat 命令可以正常工作
- javascript - 对于具有值的列,我无法验证我的表格是否包含强制性日期
- apache-flink - 动态调用 Flink 算子
- .net - 找不到元素时如何避免/忽略 OpenQA.Selenium.NoSuchElementException?
- javascript - 如何使 requestAnimationFrame 方法模块化?
- mobaxterm - Mosh 使用 MobaXterm 无法连接并出现错误,如何解决?
- c++ - 在directx11代码中更改全屏模式下的刷新率不起作用
- python - 将标量添加到图像时破坏图像像素
- django - AttributeError:“NoneType”对象没有属性“保存”django