根据鼠标位置拖动以选择 NSOutlineView 上的项目

问题描述 投票:0回答:0

我想创建一个基本的

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 以来已被弃用。

如何判断鼠标拖动是选中行还是拖动项?

cocoa drag-and-drop nsoutlineview
© www.soinside.com 2019 - 2024. All rights reserved.