gpt4 book ai didi

swiftui - 如何在 macOS 上使用 SwiftUI 显示 QLPreviewPanel?

转载 作者:行者123 更新时间:2023-12-02 19:43:49 25 4
gpt4 key购买 nike

试图找出如何在 iOS 和 macOS 上的 SwiftUI 中使用 QuickLook。我怀疑在遥远的将来,会有一些统一的 SwiftUI QL API,但目前还看不到,所以让我们利用现有的东西吧……

如何从我的 SwiftUI View 中呈现和配置 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 文档说:预览面板遵循响应者链并适应愿意控制它的第一响应者。 我的 previewPanelThing 实例不在UI 和响应链。我不确定响应链在 SwiftUI 中是如何工作的以及如何最好地处理它。

最佳答案

这里是使用QLPreviewView 直接预览 PDF 文件的可能方法(在这个演示中存储在主应用程序包中,但这不会改变常见的想法)

更新:在按钮点击时添加了带有 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
}
}
}

关于swiftui - 如何在 macOS 上使用 SwiftUI 显示 QLPreviewPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59696367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com