当前位置:  开发笔记 > IOS > 正文

NSTableView和NSOutlineView拖放

如何解决《NSTableView和NSOutlineView拖放》经验,为你挑选了3个好方法。

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

将表A中的行拖到 Outline B的一行上,在那里它们将被复制到Outline B中的行所代表的数据结构中.

将大纲B中的一行拖到大纲B中的另一行,该行将第一行表示的数据复制到第二行中表示的数据中.

我已经阅读了Apple的拖放文档并且几乎无处可去.它似乎并不适用于我需要做的事情.我错过了什么?



1> Jim Puls..:

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

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

最后,实现tableView:validateDrop:proposedRow:proposedDropOperation:tableView:acceptDrop:row:dropOperation:检查粘贴板中的任何一个,TableAPasteboardType或者OutlineBPasteboardType对绑定模型进行适当的更改,具体取决于.

一旦你进入并做到这一点,这是非常简单的.



2> Peter Hosey..:

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

未完成的Adium Xtras Creator,在BSD许可下,包含一个阵列控制器,您可以将其设置为数据源,以便在Bindings驱动的表视图中进行拖放.

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



3> Stephan..:

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

目前缺少表格的文档,但你可以找到一些很好的例子:

DragNDropOutlineView

SourceView

TableViewPlayground

对于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:

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

    如果toPasteboard:方法返回YES,则启动拖动.

    validateDrop:方法通过更新视图中的标记来控制允许哪个目标节点

    如果删除成功,则为acceptDrop:方法返回YES

这导致您必须管理两个子用例.第一个是同一视图中的拖放或两个视图之间的相同操作.此外,您可以区分移动,复制或删除操作.一个很好的例子是断点如何与Xcode中的拖放一起工作.

tableView有一些额外的方法来自定义拖放,但我提到的是使它工作的关键方法.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有