如何检测和处理从 NSPathControl 到垃圾桶图标的拖动?

How do I detect and handle a drag from NSPathControl to the Trash dock icon?

Finder 可以在其 windows 的底部显示一个 NSPathControl。如果用户将某个项目从该路径控件拖动到 Dock 的垃圾箱图标,该项目将相应地被丢弃。

我想在我的程序中实现同样的目标。但是,我无法弄清楚如何完成此操作,因为没有 draggingSession:endedAtPoint:operation: 与其他控件(例如 NSTableView.

一样

如何跟踪 NSPathControl 的拖动会话以了解该项目已被拖到废纸篓以便我可以删除它?或者有没有办法让删除自动发生?

(当然,我已经将 draggingSourceOperationMask 设置为 NSDragOperationEvery 并且可以拖动到垃圾箱 - 只是拖动的项目不会被删除。)

我建议您尝试以下方式:

  1. Subclass NSPathControl class,假设您将其命名为 MyNSPathControl

  2. 声明您的 NSPathControlDelegate,并允许拖动操作(根据 https://developer.apple.com/documentation/appkit/nspathcontroldelegate

class DragDelegate : NSObject, NSPathControlDelegate {
    func pathControl(_ pathControl: NSPathControl, shouldDrag pathItem: NSPathControlItem, with pasteboard: NSPasteboard) -> Bool {
        return true;
    }
}
  1. 将委托设置为 MyNSPathControl
class MyNSPathControl : NSPathControl {
    var myDelegate = DragDelegate()
    override func awakeFromNib() {
        super.awakeFromNib()
        self.delegate = myDelegate
    }
}
  1. 声明 MyNSPathControl 的扩展实现 NSDraggingSource
extension DraggableView: NSDraggingSource {
    func draggingSession(_ session: NSDraggingSession, sourceOperationMaskFor context: NSDraggingContext) -> NSDragOperation {
        return .every
    }

    func draggingSession(_ session: NSDraggingSession, willBeginAt screenPoint: NSPoint) {
        
    }

    func draggingSession(_ session: NSDraggingSession, movedTo screenPoint: NSPoint) {

    }

    func draggingSession(_ session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
    //  Here it goes
    }
}

拖到废纸篓时,我可以使用 NSDragOperation.delete in operation 参数。 要访问拖动的内容,您应该从会话访问粘贴板,然后访问其项目。

关于删除本身:我认为您需要手动进行。