在NSTableView中使用第一列拖动图像

时间:2017-12-15 15:52:04

标签: swift macos cocoa nstableview

我在表视图中实现了拖放操作,而我遇到的问题是拖动图像总是基于拖动开始的列,但我想使用来自第一栏。

我查看了Apple的TableViewPlayground示例,其中"复杂的OutlineView窗口"做我想做的事,但我无法弄清楚我在设置阻力方面做了哪些不同。

我在https://github.com/Uncommon/TableTest放了一个简单的例子 - 如果你从第二列拖出它所说的" stuff",那么你好像是在拖动这个词" ;东西&#34 ;.我想要的是让拖动图像始终来自第一列(带有图标和名称),无论你拖动哪一列。

在我的数据源中,我实现tableView(tableView:,pasteboardWriterForRow:)以启用拖动功能,但这并不包含有关拖动开始的列的信息。我在示例应用中缺少什么才能使其工作?

3 个答案:

答案 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:) 没有用:

来自Apple documentation

<块引用>

注意: 为了支持多项目拖动,强烈建议实现委托方法 tableView:pasteboardWriterForRow: 代替。使用该方法将导致该方法不被调用。