【问题标题】:NSTableView and NSOutlineView drag-and-dropNSTableView 和 NSOutlineView 拖放
【发布时间】:2010-10-13 13:22:54
【问题描述】:

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

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

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

我已经阅读了Apple's drag-and-drop documentation,但几乎一无所获。它似乎并不适用于我需要做的事情。我错过了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    只要你努力去做,就很简单了。

    【讨论】:

      【解决方案2】:

      您需要一个数据源 - 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。我没试过。

      【讨论】:

      • 链接结束为404,我在任何地方都找不到原始代码。
      • 这样一个完美的逻辑和干净的方式来做到这一点。感谢您重新链接。
      【解决方案3】:

      在 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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多