Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSTableView和NSOutlineView拖放_Cocoa_Drag And Drop_Cocoa Bindings_Nstableview_Nsoutlineview - Fatal编程技术网

Cocoa NSTableView和NSOutlineView拖放

Cocoa NSTableView和NSOutlineView拖放,cocoa,drag-and-drop,cocoa-bindings,nstableview,nsoutlineview,Cocoa,Drag And Drop,Cocoa Bindings,Nstableview,Nsoutlineview,我有一个NSTableView和一个NSOutlineView,它们的内容都是由绑定提供的,我希望有一些拖放功能: 将表A中的行拖到大纲B的一行上,它们将被复制到大纲B中的行所表示的数据结构中 将一行从大纲B拖到大纲B中的另一行上,这将把第一行表示的数据复制到第二行表示的数据中 我读过书,但几乎一无所获。这似乎并不适用于我需要做的事情。我遗漏了什么?您链接到的页面非常清楚您需要做什么。在表A的数据源中,实现RegisterForDragedTypes:和tableView:WriterRow

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

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

  • 将一行从大纲B拖到大纲B中的另一行上,这将把第一行表示的数据复制到第二行表示的数据中


我读过书,但几乎一无所获。这似乎并不适用于我需要做的事情。我遗漏了什么?

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

在outline B的数据源中,实现相同的两种方法,并在粘贴板上放置一些私有的
outline粘贴板类型
数据

最后,实现
tableView:validateDrop:proposedRow:proposedDropOperation:
tableView:acceptDrop:row:dropOperation:
以检查粘贴板是否存在
tablePasteBoardType
OutlinePasteBoardType
,并根据具体情况对绑定模型进行适当更改


一旦你投入并完成它,它就相当简单了。

你需要一个数据源,单靠绑定是无法做到的

未完成的Adium Xtras创建者,在BSD许可下,包括


此要求可能不适用于NSOutlineView和NSTreeController。我还没有尝试过。在MacOS 10.7中,添加了一些新的协议来实现这一点

目前有一个很好的例子,但你可以找到一些很好的例子:

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

  • (BOOL)tableView:writeRowsWithIndexes:toPasteboard:
  • tableView:validateDrop:proposedRow:proposedDropOperation:
  • tableView:acceptDrop:row:dropOperation:
对于NSOutlineView,协议NSOutlineViewDataSource定义了以下方法:

  • (BOOL)大纲视图:writeItems:toPasteboard:
  • (nsdragooperation)大纲视图:validateDrop:proposedItem:proposedChildIndex:
  • (BOOL)大纲视图:acceptDrop:item:childIndex:
这些是为每种视图类型实现的最低要求。 这些用例非常相似

  • 如果toPasteboard:方法返回YES,则开始拖动
  • validateDrop:方法通过更新视图中的标记来控制允许哪个目标节点
  • 如果删除成功,则为acceptDrop:method返回YES
  • 这导致您必须管理两个子用例。第一种方法是在同一视图中进行拖放,或者在两个视图之间进行相同的操作。此外,您还可以区分移动、复制或删除操作。一个很好的例子是断点如何在Xcode中使用拖放操作


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

    该链接以404结尾,我在任何地方都找不到原始代码。这是一种完美的逻辑和干净的方法。谢谢你重新链接。