我想将一个或多个图像从macOS应用程序中的NSCollectionView
拖放到计算机上的目标位置或照片应用程序中。
我正在使用NSFilePromiseProvider
,因为这些图像位于我的Android设备上,而我的应用程序中仅显示缩略图。我想在拖动完成后将图像拉到计算机上。
extension ImageViewController: NSCollectionViewDelegate {
func collectionView(_ collectionView: NSCollectionView, canDragItemsAt indexPaths: Set<IndexPath>, with event: NSEvent) -> Bool {
return true
}
func collectionView(_ collectionView: NSCollectionView, pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting? {
// Return a File Promise Provider as Pasteboard Writing.
let provider = NSFilePromiseProvider(fileType: kUTTypeJPEG as String, delegate: self)
provider.userInfo = meta[indexPath.item] // Some data to identify the dragged image
return provider
}
func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>,
dropOperation proposedDropOrperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
return [.copy] // Not called if the drag destination is outside of my app
}
}
extension ImageViewController: NSFilePromiseProviderDelegate {
func filePromiseProvider(_ filePromiseProvider: NSFilePromiseProvider, fileNameForType fileType: String) -> String {
// Return the promised filename.
let metadata = filePromiseProvider.userInfo as! Metadata
return metadata.fileName
}
func operationQueue(for filePromiseProvider: NSFilePromiseProvider) -> OperationQueue {
return workQueue
}
func filePromiseProvider(_ filePromiseProvider: NSFilePromiseProvider, writePromiseTo url: URL, completionHandler: @escaping (Error?) -> Void) {
// Pull image over adb.
let metadata = filePromiseProvider.userInfo as! Metadata
ADB.executeAsync(args: "pull", metadata.path, url.path, callback: { (output) in
completionHandler(nil)
})
}
}
到目前为止,此方法有效,但我需要进行一些改进:
如何在拖动时将NSDragOperation
设置为.copy
以显示带有加号的红色圆圈?仅当在我的应用程序内部拖动时才调用用于验证NSCollectionViewDelegate
下降的函数。当我以NSURL
的形式提供文件NSPasteboardWriting
而不是诺言时,加号图标会自动出现。但是由于文件不在我的计算机上,因此我必须使用Promise。
我还希望能够将图像直接拖到“照片”应用中或停靠图标上,以便自动导入图像。同样,将NSURL
用作NSPasteboardWriting
是可行的,但这对我来说是不可能的。照片应用程序可以处理文件承诺吗?