如何检测和处理从 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
并且可以拖动到垃圾箱 - 只是拖动的项目不会被删除。)
我建议您尝试以下方式:
Subclass NSPathControl class,假设您将其命名为 MyNSPathControl
声明您的 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;
}
}
- 将委托设置为 MyNSPathControl
class MyNSPathControl : NSPathControl {
var myDelegate = DragDelegate()
override func awakeFromNib() {
super.awakeFromNib()
self.delegate = myDelegate
}
}
- 声明 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 参数。
要访问拖动的内容,您应该从会话访问粘贴板,然后访问其项目。
关于删除本身:我认为您需要手动进行。
Finder 可以在其 windows 的底部显示一个 NSPathControl
。如果用户将某个项目从该路径控件拖动到 Dock 的垃圾箱图标,该项目将相应地被丢弃。
我想在我的程序中实现同样的目标。但是,我无法弄清楚如何完成此操作,因为没有 draggingSession:endedAtPoint:operation:
与其他控件(例如 NSTableView
.
如何跟踪 NSPathControl
的拖动会话以了解该项目已被拖到废纸篓以便我可以删除它?或者有没有办法让删除自动发生?
(当然,我已经将 draggingSourceOperationMask
设置为 NSDragOperationEvery
并且可以拖动到垃圾箱 - 只是拖动的项目不会被删除。)
我建议您尝试以下方式:
Subclass NSPathControl class,假设您将其命名为 MyNSPathControl
声明您的 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;
}
}
- 将委托设置为 MyNSPathControl
class MyNSPathControl : NSPathControl {
var myDelegate = DragDelegate()
override func awakeFromNib() {
super.awakeFromNib()
self.delegate = myDelegate
}
}
- 声明 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 参数。 要访问拖动的内容,您应该从会话访问粘贴板,然后访问其项目。
关于删除本身:我认为您需要手动进行。