在NstableView中使用第一列作为拖动图像



我正在在表视图中实现拖放,而我遇到的问题是,拖动图像始终基于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:)

最新更新