我在表视图中实现了拖放操作,而我遇到的问题是拖动图像总是基于拖动开始的列,但我想使用来自第一栏。
我查看了Apple的TableViewPlayground示例,其中"复杂的OutlineView窗口"做我想做的事,但我无法弄清楚我在设置阻力方面做了哪些不同。
我在https://github.com/Uncommon/TableTest放了一个简单的例子 - 如果你从第二列拖出它所说的" stuff",那么你好像是在拖动这个词" ;东西&#34 ;.我想要的是让拖动图像始终来自第一列(带有图标和名称),无论你拖动哪一列。
在我的数据源中,我实现tableView(tableView:,pasteboardWriterForRow:)
以启用拖动功能,但这并不包含有关拖动开始的列的信息。我在示例应用中缺少什么才能使其工作?
答案 0 :(得分:0)
NSTableView
拖动拖动开始的列,NSOutlineView
拖动大纲列。如果要更改图像,请将NSTableView
子类化并覆盖dragImageForRows(with:tableColumns:event:offset:)
。
答案 1 :(得分:0)
接受的答案对我不起作用。相反,我必须在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
}
}
}
}
信贷提供给this answer,以提供大部分解决方案。
答案 2 :(得分:0)
回应为什么
dragImageForRows(with:tableColumns:event:offset:)
没有用:
注意: 为了支持多项目拖动,强烈建议实现委托方法 tableView:pasteboardWriterForRow: 代替。使用该方法将导致该方法不被调用。