macos - 如何检测和处理从 NSPathControl 到垃圾站图标的拖动?
问题描述
Finder 可以NSPathControl
在其窗口底部显示一个。如果用户将某个项目从该路径控件拖动到 Dock 的垃圾箱图标,则该项目将相应地被丢弃。
我喜欢在我的程序中实现同样的目标。但是,我无法弄清楚如何实现这一点,因为没有draggingSession:endedAtPoint:operation:
其他控件,例如NSTableView
.
如何跟踪拖动会话NSPathControl
以了解该项目已被拖动到废纸篓以便我可以删除它?或者有没有办法让删除自动发生?
(当然,我已经设置了draggingSourceOperationMask
toNSDragOperationEvery
并且可以拖动到垃圾箱 - 只是拖动的项目不会被删除。)
解决方案
我建议您尝试以下方式:
子类化 NSPathControl 类,假设你将它命名为 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。要访问拖动的内容,您应该从会话访问粘贴板,然后访问其项目。
关于删除本身:我认为您需要手动进行。
推荐阅读
- python - 有没有办法在多台笔记本电脑上训练 ML 模型?
- c# - 如何自动重新定位相机以将整个对象包含在视图中?
- reactjs - 出于奇怪/未知的原因,在 Gatsby 中出现了无样式的内容。如何诊断问题?
- http - 如何使用 Google 表格触发器触发 Google Cloud 函数?
- c++ - 每当我找到密钥时如何增加值?BST
- flutter - 如何在颤动中创建颜色矩阵?
- audio - m3u8 清单文件中的多个音轨
- c++ - 模板类型的 ADL 和友元函数
- ios - 在 Firebase (iOS) 中登录 Facebook,错误 10814
- sql-server - 运行数据库脚本错误 SQL Server/报表服务器