我有一个NSTableView和一个NSOutlineView,它们的内容都是由绑定提供的,我希望有一些拖放功能:
将行A 中的行拖到一行大纲B上,然后将它们复制到大纲B中的行所代表的数据结构中。
将一行从概要B 拖到概要B中的另一行,该行将第一行代表的数据复制到第二行代表的数据中。
< / LI>我读过Apple's drag-and-drop documentation并且几乎无处可去。它似乎并不适用于我需要做的事情。我错过了什么?
答案 0 :(得分:7)
您链接到的页面非常清楚您需要做什么。在表A的数据源中,实施registerForDraggedTypes:
和tableView:writeRowsWithIndexes:toPasteboard:
以在粘贴板上放置一些私有TableAPasteboardType
数据。
在大纲B的数据源中,实现相同的两种方法,并在粘贴板上放置一些私有OutlineBPasteboardType
数据。
最后,实施tableView:validateDrop:proposedRow:proposedDropOperation:
和tableView:acceptDrop:row:dropOperation:
以检查TableAPasteboardType
或OutlineBPasteboardType
的粘贴板,并对绑定模型进行相应的更改,具体取决于。
一旦你进去并且这样做,它就非常简单。
答案 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:
这些是为每种视图类型实现的最低要求。 用例非常相似。
这导致您必须管理两个子用例。第一个是拖累和放大器。在两个视图之间放入相同视图或相同操作。此外,您可以区分移动,复制或删除操作。一个很好的例子是断点如何与drag&amp;放入Xcode。
tableView还有一些其他方法可以自定义拖放功能。但是,我提到的那些是让它发挥作用的关键方法。