如何解决如何为 NSOutlineView 执行两种类型的拖放操作?
我如何做 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。我的数据模型是结构。我已将侧边栏行转换为类,同时将侧边栏组保留为结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。