问题描述
我如何做 Finder 拖放样式?
我的 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
}
}
我的代码不太好。
同样,您如何进行另一种拖放操作?
解决方法
感谢this answer。我的数据模型是结构。我已将侧边栏行转换为类,同时将侧边栏组保留为结构。