DropDelegate Safari 拖动图像

Cra*_*0ek 5 macos drag-and-drop image swift swiftui

我正在尝试实现该DropDelegate模式以允许将图像拖到我的视图中并加载它们。这对于取景器中的图像效果很好,但是当将图像从 safari 拖到我的视图中时,这不起作用。

我注意到所提供的信息/提供商的typeIdentifier、 或UTType不可用。有人可以帮我把这个图像从 Safari 拖放到工作中吗?

struct DropImageView: View, DropDelegate {
    @State private var image = NSImage(systemSymbolName: "crop", accessibilityDescription: nil)

    func performDrop(info: DropInfo) -> Bool {
        print("Performing drop: \(info)")
        if info.hasItemsConforming(to: [.image]), let provider = info.itemProviders(for: [.image]).first {
            print(info.itemProviders(for: [String]()))
            print("Image, provider: \(provider)")
            provider.loadItem(forTypeIdentifier: "", options: nil) { something, error in
                print(something ?? error!)
            }
        } else if info.hasItemsConforming(to: [.fileURL]), let provider = info.itemProviders(for: [.fileURL]).first {
            print("FileURL, provider: \(provider)")
            provider.loadDataRepresentation(forTypeIdentifier: UTType.fileURL.identifier) { data, error in
                if let data = data, let path = String(data: data, encoding: .utf8), let url = URL(string: path) {
                    print(data, path, url)
                    DispatchQueue.main.async {
                        self.image = NSImage(contentsOf: url)
                    }
                }
            }
        } else {
            print("Unsupported, info: \(info)")
            return false
        }
        return true
    }

    var body: some View {
        VStack {
            if let image = image {
                Image(nsImage: image)
            }
            Text("Please drop your image here...")
        }
        .onDrop(of: [.image, .fileURL], delegate: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在通过拖动我的 SO 个人资料图片来输出示例

Performing drop: DropInfo(platformDropInfo: SwiftUI.(unknown context at $7fff42656708).DropInfo_Mac(location: (111.75277709960938, 28.4794921875), pasteboard: <NSPasteboard: 0x60000198e760>))
[<NSItemProvider: 0x600001681ff0> {types = (
)}]
Image, provider: <NSItemProvider: 0x600001681d50> {types = (
)}
Error Domain=NSItemProviderErrorDomain Code=-1000 "Cannot load representation of type " UserInfo={NSLocalizedDescription=Cannot load representation of type }

Run Code Online (Sandbox Code Playgroud)

Cra*_*0ek 6

该问题与缺少的类型标识符有关。通过支持不仅仅是UTType.image,我确实设法使有效的拖放工作。

func performDrop(info: DropInfo) -> Bool {
    print("Performing drop: \(info)")
    if info.hasItemsConforming(to: [.image, .jpeg, .tiff, .gif, .png, .icns, .bmp, .ico, .rawImage, .svg]) {
        let providers = info.itemProviders(for: [.image, .jpeg, .tiff, .gif, .png, .icns, .bmp, .ico, .rawImage, .svg])

        let types: [UTType] = [.image, .png, .jpeg, .tiff, .gif, .icns, .ico, .rawImage, .bmp, .svg]

        for type in types {
            for provider in providers {
                if provider.registeredTypeIdentifiers.contains(type.identifier) {
                    print("Provider \(provider) found for \(type.identifier)")
                    provider.loadDataRepresentation(forTypeIdentifier: type.identifier) { data, error in
                        if let data = data {
                            DispatchQueue.main.async {
                                self.image = NSImage(data: data)
                            }
                        }
                        print(data ?? error!)
                    }
                    return true
                }
            }
        }
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)