我想创建一个基本的
NSOutlineView
来模仿 macOS Finder“作为列表”的行为。单击并拖动时,NSOutlineView
应选择行或开始拖动会话,具体取决于鼠标的起始位置。
我在多个应用程序中注意到了这种行为——Finder(作为列表)、ForkLift(作为列表)、Nova(文件浏览器面板)——所以我认为这是
NSOutlineView
. 的一些标准行为
但是默认
NSOutlineView
,无论是在 Interface Builder 中创建还是以编程方式创建,总是选择行或总是拖动行。
verticalMotionCanBeginDrag
的NSTableView
属性看起来相关,但不会启用上述行为。启用后,鼠标拖动将 always 开始拖动会话。禁用时,垂直鼠标拖动将always选择行。
我已经尝试过基于视图和基于单元格的
NSOutlineView
,两者都具有相同的拖动行为,具体取决于verticalMotionCanBeginDrag
.
如果从以下
NSOutlineViewDelegate
方法返回项目,则开始拖动会话:
func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
// if nil is returned for all items, no dragging session will start
// if an item is returned, a dragging session will start
}
但是在那里做逻辑感觉很奇怪,因为所有目标行项目都调用它。
或者使用以下
NSOutlineViewDelegate
方法:
func outlineView(_ outlineView: NSOutlineView, writeItems items: [Any], to pasteboard: NSPasteboard) -> Bool {
// determine starting point of drag?
}
但这自 macOS 10.15 以来已被弃用。
如何判断鼠标拖动是选中行还是拖动项?