Swift 将多个NSImage复制到NSPasteboard

Swift 将多个NSImage复制到NSPasteboard,swift,macos,cocoa,nsimage,nspasteboard,Swift,Macos,Cocoa,Nsimage,Nspasteboard,我正在尝试使用Swift 4将多个NSIMAGE复制到粘贴板上-如下所示: private func putItemsOnPasteboard (_ items: [Int]) { if let images = mainImageController?.getNSImages(for: items) { NSPasteboard.general.clearContents() NSPasteboard.general.writeObjects(image

我正在尝试使用Swift 4将多个NSIMAGE复制到粘贴板上-如下所示:

private func putItemsOnPasteboard (_ items: [Int]) {
    if let images = mainImageController?.getNSImages(for: items) {
        NSPasteboard.general.clearContents()
        NSPasteboard.general.writeObjects(images)
        if let c = NSPasteboard.general.pasteboardItems?.count {
            print (c)
        }
    }
}
NSImage实现了NSPasteboardWriting,并且工作正常。问题是,如果我粘贴到邮件中,它只粘贴第一张图片,我正在努力找出原因

例如,如果我用三个图像调用函数,它似乎都能工作,我的诊断“print(c)”正确地显示“3”。但如果我粘贴到邮件(或OneNote等)中,它只粘贴第一张图像

我知道Mail支持粘贴多个图像,因为我可以在Apple照片中选择三个缩略图,将它们复制到粘贴板上,然后它会正确地将这三个缩略图粘贴到Mail中


任何线索都将不胜感激

如果我在照片中复制一组照片,然后检查粘贴板类型,我会得到:

import Cocoa

print(NSPasteboard.general.types?.map { $0.rawValue } ?? [])
产出:

["dyn.ah62d4rv4gu8ywyc2nbu1g7dfqm10c6xekr1067dwr70g23pw", "IPXPasteboardController", "com.apple.PhotoPrintProduct.photoUUID", "public.file-url", "CorePasteboardFlavorType 0x6675726C", "dyn.ah62d4rv4gu8y6y4grf0gn5xbrzw1gydcr7u1e3cytf2gn", "NSFilenamesPboardType", "dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu", "Apple URL pasteboard type"]
[file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e03/UNADJUSTEDNONRAW_thumb_1e03.jpg, file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e04/UNADJUSTEDNONRAW_thumb_1e04.jpg, file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e05/kOBCUhzGRcyeVfBCC8VfvQ_thumb_1e05.jpg]
在这些类型中,我感兴趣的是
public.file url
,这表明照片正在将一组url复制到粘贴板上。让我们检验一下这个假设:

import Cocoa

print(NSPasteboard.general.readObjects(forClasses: [NSURL.self], options: nil) ?? [])
产出:

["dyn.ah62d4rv4gu8ywyc2nbu1g7dfqm10c6xekr1067dwr70g23pw", "IPXPasteboardController", "com.apple.PhotoPrintProduct.photoUUID", "public.file-url", "CorePasteboardFlavorType 0x6675726C", "dyn.ah62d4rv4gu8y6y4grf0gn5xbrzw1gydcr7u1e3cytf2gn", "NSFilenamesPboardType", "dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu", "Apple URL pasteboard type"]
[file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e03/UNADJUSTEDNONRAW_thumb_1e03.jpg, file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e04/UNADJUSTEDNONRAW_thumb_1e04.jpg, file:///Users/*deleted*/Pictures/Photos%20Library.photoslibrary/resources/proxies/derivatives/1e/00/1e05/kOBCUhzGRcyeVfBCC8VfvQ_thumb_1e05.jpg]

输出是一个指向JPEG文件的URL列表,这表明照片确实提供了一个URL列表,并将其放在粘贴板上。因此,也许您可以将
NSImage
s的TIFF表示保存到一个临时位置,然后将这些临时文件的URL写入粘贴板,这样就可以了。

Charles Srstka的回答在这里非常有用。虽然可以在粘贴板上放置多个NSIMAGE,但只能粘贴一个NSIMAGE

Swift的URL对象不符合NSPasteboardWriting,但NSURL符合,并且它没有只能粘贴一个的限制

所以这起作用了

    private func putImagesOnPasteboard (_ images: [Image], folderURL: URL) {
    let imageURLs = images.map() {
        image in
        return NSURL (fileURLWithPath: folderURL.appendingPathComponent(image.fileName).path)
    }
    NSPasteboard.general.clearContents()
    NSPasteboard.general.writeObjects(imageURLs)
}

你可能应该做的是复制照片,然后分析应用程序中粘贴板的内容。然后尝试复制照片生成的粘贴板内容格式。