【发布时间】:2021-01-24 05:04:02
【问题描述】:
如何进行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
}
}
我的代码并没有完全做到这一点。
同样,其他样式的拖放怎么做?
【问题讨论】:
-
您是否尝试过设置
draggingDestinationFeedbackStyle?outlineView(_:draggingSession:endedAt:operation:)在拖动会话结束时调用 = 释放鼠标按钮时。 -
我编辑了我的问题。我贴错了方法。它应该是
outlineView(_acceptDrop:childIndex:)。结果还是一样。 -
acceptDrop也会在释放鼠标按钮时调用。.gap的 documentation 表示在outlineView(_:draggingSession:willBeginAt:forItems:)中设置样式,但viewDidLoad也是一个选项。.gap风格在我看来有点儿马虎。
标签: swift cocoa drag-and-drop appkit nsoutlineview