NSTableView和NSOutlineView拖放

时间:2009-03-16 05:29:33

标签: cocoa drag-and-drop cocoa-bindings nstableview nsoutlineview

我有一个NSTableView和一个NSOutlineView,它们的内容都是由绑定提供的,我希望有一些拖放功能:

  • 将行A 中的行拖到一行大纲B上,然后将它们复制到大纲B中的行所代表的数据结构中。

  • 将一行从概要B 拖到概要B中的另一行,该行将第一行代表的数据复制到第二行代表的数据中。

    < / LI>

我读过Apple's drag-and-drop documentation并且几乎无处可去。它似乎并不适用于我需要做的事情。我错过了什么?

3 个答案:

答案 0 :(得分:7)

您链接到的页面非常清楚您需要做什么。在表A的数据源中,实施registerForDraggedTypes:tableView:writeRowsWithIndexes:toPasteboard:以在粘贴板上放置一些私有TableAPasteboardType数据。

在大纲B的数据源中,实现相同的两种方法,并在粘贴板上放置一些私有OutlineBPasteboardType数据。

最后,实施tableView:validateDrop:proposedRow:proposedDropOperation:tableView:acceptDrop:row:dropOperation:以检查TableAPasteboardTypeOutlineBPasteboardType的粘贴板,并对绑定模型进行相应的更改,具体取决于。

一旦你进去并且这样做,它就非常简单。

答案 1 :(得分:5)

您需要一个数据源-AFAIK,单独使用Bindings就无法实现这一点。

未完成的Adium Xtras Creator,属于BSD许可,包括an array controller that you can set as the data source to get drag-and-drop in a Bindings-powered table view

此要求可能不适用于NSOutlineView和NSTreeController。我没试过。

答案 2 :(得分:5)

在MacOS 10.7中添加了一些新协议来实现这一点。

目前有lack of documentation for tables,但您可以找到一些不错的例子:

对于NSTableViwew,协议NSTableViewDataSource定义了以下方法:

  • (BOOL)tableView:writeRowsWithIndexes:toPasteboard:
  • tableView:validateDrop:proposedRow:proposedDropOperation:
  • tableView:acceptDrop:row:dropOperation:

对于NSOutlineView,协议NSOutlineViewDataSource定义了以下方法:

  • (BOOL)outlineView:writeItems:toPasteboard:
  • (NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
  • (BOOL)outlineView:acceptDrop:item:childIndex:

这些是为每种视图类型实现的最低要求。 用例非常相似。

  1. 如果toPasteboard:方法返回YES,则启动拖动。
  2. validateDrop:方法通过更新视图中的标记来控制允许哪个目标节点
  3. 如果删除成功,则为acceptDrop:方法返回YES
  4. 这导致您必须管理两个子用例。第一个是拖累和放大器。在两个视图之间放入相同视图或相同操作。此外,您可以区分移动,复制或删除操作。一个很好的例子是断点如何与drag&amp;放入Xcode。

    tableView还有一些其他方法可以自定义拖放功能。但是,我提到的那些是让它发挥作用的关键方法。