我正在在表视图中实现拖放,而我遇到的问题是,拖动图像始终基于drag启动的列,但我想使用第一列中的图像。
我看了Apple的tableviewplayground样本,其中"复杂的概述"窗口可以完成我想要的东西,但是我无法弄清楚设置拖动方面的不同。
我在https://github.com/uncommon/tabletest上汇总了一个简单的示例 - 如果您从第二列拖动" stuelt",那么看起来您正在拖动" supper"一词。我想要的是让拖放图像总是来自第一列(带有图标和名称),无论您从哪个列拖到。
在我的数据源中,我实现了tableView(tableView:,pasteboardWriterForRow:)
来启用拖动,但这不包括有关拖动启动的列的信息。示例应用程序中我缺少什么来完成此工作?
接受的答案对我不起作用。相反,我必须在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:)
不起作用:
来自Apple文档:
注意:为了支持多项目阻力,强烈建议实现委托方法表:pasteboardWriterForrow:而是。使用该方法将导致该方法不称为。
NSTableView
拖动拖动启动的列, NSOutlineView
拖动轮廓列。如果您想更改图像,请子类NSTableView
和覆盖dragImageForRows(with:tableColumns:event:offset:)
。