提问者:小点点

如何在macOS上的SwiftUI中实现对第三方应用程序的拖放


我试图在谷歌上寻找答案,但我发现的只是如何接受来自其他应用程序的拖放并拖放到单个应用程序中,也主要是 iOS 焦点,没有很多与 macOS 相关的资源。

我写了一个macOS工具栏应用程序,我正试图实现拖放程序创建的图像,只在内存中作为图像。为了允许图像是可拖动的,我实现了一个DraggableImage结构来代替SwiftUI视图中的< code>Image视图:

struct DraggableImage: View {
    let image: NSImage

    var body: some View {
        Image(nsImage: image)
            .resizable()
            .scaledToFit()
            .padding()
            .onDrag {
                guard let tiffRepresentation = image.tiffRepresentation,
                      let bitmapImage = NSBitmapImageRep(data: tiffRepresentation),
                      let bitmapRepresentation = bitmapImage.representation(using: .png, properties: [:]) else {

                    return NSItemProvider(item: image.tiffRepresentation as NSSecureCoding?, typeIdentifier: kUTTypeTIFF as String)
                }

                let provider = NSItemProvider(item: bitmapRepresentation as NSSecureCoding?,
                                              typeIdentifier: kUTTypePNG as String)

                provider.previewImageHandler = { (handler, _, _) -> Void in
                    handler?(bitmapRepresentation as NSSecureCoding?, nil)
                }

                return provider
            }
    }
}

如果我将图像拖到TextEdit或Email应用程序等应用程序上,DraggableImage结构将按预期工作。见下文:

然而,我无法将图片拖到任何基于文件的应用程序上,比如Finder窗口。见下文:

同样的事情拖到桌面(技术上是一个全屏查找器窗口):

实施中缺少什么?

PS:完整的演示项目托管在GitHub上,供对实现感兴趣的人使用。


共1个答案

匿名用户

您需要导出文件 URL 而不是数据,以便 MacOS 可以复制此文件。

基本示例:

let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("dragExport.png")
try! bitmapRepresentation.write(to: url)

let provider = NSItemProvider(item: url as NSSecureCoding?, typeIdentifier: kUTTypeFileURL as String)
provider.suggestedName = url.lastPathComponent