如何为 NSOutlineView 执行两种类型的拖放操作?

问题描述

我如何做 Finder 拖放样式?

enter image description here

我的 ViewController 代码是这样的。

class ViewController: NSViewController {
    override func viewDidLoad() {
        outlineView.registerForDraggedTypes([.string])
        outlineView.setDraggingSourceOperationMask(.move,forLocal: true)
    }
}

拖放代码看起来像这样。

extension ViewController: NSOutlineViewDataSource {
    func outlineView(_ outlineView: NSOutlineView,pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
        guard item is SidebarRow else { return nil }
        let sidebarRowIndex = outlineView.row(forItem: item) + -1
        
        return sidebarSections[0].rows[sidebarRowIndex].name.rawValue as Nsstring
    }
    
    func outlineView(_ outlineView: NSOutlineView,validateDrop info: NSDraggingInfo,proposedItem item: Any?,proposedChildindex index: Int) -> NSDragOperation {
        guard let outlineView = info.draggingSource as? NSOutlineView else { return [] }
        outlineView.draggingDestinationFeedbackStyle = .gap
        return .move
    }
    
    func outlineView(_ outlineView: NSOutlineView,acceptDrop info: NSDraggingInfo,item: Any?,childindex index: Int) -> Bool {
        guard item != nil else { return false }
        
        guard let items = info.draggingPasteboard.pasteboardItems,let pasteboardItem = items.first,let pasteboardItemName = pasteboardItem.string(forType: .string),let rowIndex = sidebarSections[0].rows.firstIndex(where: { $0.name.rawValue == pasteboardItemName }) else { return false }
        
        let new = sidebarSections[0].rows[rowIndex]
        
        sidebarSections[0].rows.remove(at: rowIndex)
        sidebarSections[0].rows.insert(new,at: index)

        outlineView.moveItem(at: rowIndex,inParent: item,to: index,inParent: item)

        return true
    }
}

我的代码不太好。

同样,您如何进行另一种拖放操作?

enter image description here

解决方法

感谢this answer。我的数据模型是结构。我已将侧边栏行转换为类,同时将侧边栏组保留为结构。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...