我有一个 NSTableView 和一个 NSOutlineView,它们的内容都由绑定提供,我想要一些拖放功能:
将表 A中的行拖到大纲 B 的一行中,在那里它们将被复制到大纲 B 中的行所代表的数据结构中。
将大纲 B 中的一行拖到大纲 B中的另一行上,这会将第一行表示的数据复制到第二行表示的数据中。
我已经阅读了Apple 的拖放文档,但几乎一无所获。它似乎并不适用于我需要做的事情。我错过了什么?
我有一个 NSTableView 和一个 NSOutlineView,它们的内容都由绑定提供,我想要一些拖放功能:
将表 A中的行拖到大纲 B 的一行中,在那里它们将被复制到大纲 B 中的行所代表的数据结构中。
将大纲 B 中的一行拖到大纲 B中的另一行上,这会将第一行表示的数据复制到第二行表示的数据中。
我已经阅读了Apple 的拖放文档,但几乎一无所获。它似乎并不适用于我需要做的事情。我错过了什么?
您链接到的页面非常清楚您需要做什么。在表 A 的数据源中,实现registerForDraggedTypes:
并将tableView:writeRowsWithIndexes:toPasteboard:
一些私有TableAPasteboardType
数据放在粘贴板上。
在大纲 B 的数据源中,实现相同的两个方法,并将一些私有OutlineBPasteboardType
数据放在粘贴板上。
最后,实现tableView:validateDrop:proposedRow:proposedDropOperation:
并tableView:acceptDrop:row:dropOperation:
检查粘贴板中的一个TableAPasteboardType
或OutlineBPasteboardType
,并对绑定的模型进行适当的更改,具体取决于。
一旦你投入并做到这一点,这非常简单。
你需要一个数据源——AFAIK,你不能单独使用 Bindings 来实现这一点。
未完成的 Adium Xtras Creator,在 BSD 许可下,包括一个数组控制器,您可以将其设置为数据源,以便在 Bindings 驱动的表视图中进行拖放。
这个要求可能不适用于 NSOutlineView 和 NSTreeController。我没试过。
在 MacOS 10.7 中,添加了一些新协议来实现这一点。
目前缺少表格文档,但您可以找到一些不错的示例:
对于 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:
这些是为每种视图类型实现的最低要求。用例非常相似。
这导致您必须管理两个子用例。第一个是在同一个视图内的拖放或两个视图之间的相同操作。此外,您可以区分移动、复制或删除操作。一个很好的例子是断点如何在 Xcode 中与拖放一起工作。
tableView 有一些额外的方法来自定义拖放,但我提到的那些是让它工作的关键方法。