![](/img/trans.png)
[英]Detect column drag or resize in NSTableView while it is happening in Swift
[英]Use first column for drag image in NSTableView
我正在表视图中实现拖放,我遇到的问题是拖动图像始终基于拖动开始的列,但我想使用第一列中的图像。
我查看了 Apple 的 TableViewPlayground 示例,其中“Complex OutlineView Window”可以满足我的要求,但我不知道在设置拖动方面我做了什么不同的事情。
我在https://github.com/Uncommon/TableTest 上放了一个简单的例子——如果你从第二列拖拽“东西”,那么看起来你在拖拽“东西”这个词。 我想要的是让拖动图像始终来自第一列(带有图标和名称),无论您从哪一列拖动。
在我的数据源中,我实现了tableView(tableView:,pasteboardWriterForRow:)
以启用拖动,但这不包括有关拖动开始的列的信息。示例应用程序中我缺少什么才能使其工作?
NSTableView
拖拽开始拖拽的那一列, NSOutlineView
拖拽大纲列。 如果你想改变图像,子NSTableView
并覆盖dragImageForRows(with:tableColumns:event:offset:)
。
接受的答案对我不起作用。 相反,我必须在NSTableViewDataSource
实现以下可选函数:
func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
// Or whatever cell you want as the drag image
let cell = tableView.view(atColumn: 0, row: rowIndexes.first!, makeIfNecessary: false) as? NSTableCellView
session.enumerateDraggingItems(options: .concurrent, for: nil, classes: [NSPasteboardItem.self], searchOptions: [:]) {(draggingItem, idx, stop) in
if let cell = cell {
let rect = cell.bounds
let drag = session.draggingLocation
// You can customize the image starting point and size here
draggingItem.setDraggingFrame(NSRect(x: drag.x, y: drag.y, width: rect.width, height: rect.height), contents: cell.draggingImageComponents)
draggingItem.imageComponentsProvider = {
return cell.draggingImageComponents
}
}
}
}
归功于此答案提供了大部分解决方案。
响应为什么dragImageForRows(with:tableColumns:event:offset:)
不起作用:
从苹果文档:
注意:为了支持多项目拖动,强烈建议实现委托方法 tableView:pasteboardWriterForRow: 代替。 使用该方法将导致该方法不被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.