首页 > 解决方案 > 如何检测和处理从 NSPathControl 到垃圾站图标的拖动?

问题描述

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

我喜欢在我的程序中实现同样的目标。但是,我无法弄清楚如何实现这一点,因为没有draggingSession:endedAtPoint:operation:其他控件,例如NSTableView.

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

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

标签: macosnspathcontrol

解决方案


我建议您尝试以下方式:

  1. 子类化 NSPathControl 类,假设你将它命名为 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。要访问拖动的内容,您应该从会话访问粘贴板,然后访问其项目。

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


推荐阅读