簡體   English   中英

在 NSTableView 中使用第一列拖動圖像

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM