使用文件承诺进行NSCollectionView拖放

时间:2018-09-01 19:20:24

标签: swift macos drag-and-drop nscollectionview

我想将一个或多个图像从macOS应用程序中的NSCollectionView拖放到计算机上的目标位置或照片应用程序中。

我正在使用NSFilePromiseProvider,因为这些图像位于我的Android设备上,而我的应用程序中仅显示缩略图。我想在拖动完成后将图像拉到计算机上。

NSCollectionViewDelegate

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
    }
}

NSFilePromiseProviderDelegate

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是可行的,但这对我来说是不可能的。照片应用程序可以处理文件承诺吗?

0 个答案:

没有答案