0

我在我的一个应用程序中使用了优秀的NSOutlineView子类PXSourceList。我正在尝试实现拖放到我的PXSourceList实例。我有:

  1. 将 IB 中的委托和数据源插座都连接到我的控制器
  2. awakeFromNib控制器中,将self设置为委托和数据源
  3. awakeFromNib控制器中,为拖拽类型注册
  4. 在控制器中,实现必要条件writeItems: validateDrop: acceptDrop:namesOfPromisedFilesDroppedAtDestination:方法,并在控制器的 .h 文件中声明它们

由于某种原因,(4)中实现的拖放方法根本没有触发。我试过了:

  • 将日志语句放在拖放数据源方法中——它们永远不会被调用。
  • 将日志语句放在记录实例的其他数据源方法之一中registeredDraggedTypes-PXSourceList它始终返回分配的正确拖动类型awakeFromNib.
  • 获取PXSourceList视图实例并将其从除 NSWindow 实例之外的所有包含视图中取消嵌入 - 那里也没有运气。
  • 将我的应用程序中的数据源代码复制粘贴到随附的示例应用程序中PXSourceList- 无需修改即可全部运行。
  • 将示例应用程序中的工作代码复制粘贴到 SK 源代码中 - 它不起作用。

所以基本上我在一个地方,除了拖放方法之外,所有数据源方法都被调用。它的行为就像我没有为拖动类型注册一样,但是 1)我知道我有 2)实例响应它已为我设置的拖动类型注册。

有任何想法吗?

4

1 回答 1

2

不幸的是,这是 PXSourceList 实现方式的副作用;如果您查看 PXSourceList.m 内部,它使自己成为自身的委托和数据源(因为它继承自 NSOutlineView),实现了所有大纲视图委托和数据源方法,并且当每个这些方法被调用时,它都会调用实现PXSourceList 通过 PXSourceListDelegate 和 PXSourceListDataSource 方法使用的实际委托和数据源。当我构建 PXSourceList 时,其背后的原因是拥有一致的 API,而不是将 NSOutlineViewDelegate/DataSource 方法与 PXSourceListDelegate/DataSource 的附加方法(用于徽章和图标等)混合和匹配。

10.7 SDK(我假设您正在使用)向 NSOutlineViewDataSource 添加了一些额外的拖放方法。在这里特别相关的是, NSOutlineViewDataSource-outlineView:pasteboardWriterForItem:添加了附加方法,这是 -outlineView:writeItems:toPasteboard:.

当您开始拖动时,NSOutlineView 会查询数据源(通过使用-respondsToSelector:)来确定它实现了哪些方法以及调用哪些方法。鉴于 PXSourceList 实现了 both,并在实际数据源上调用了相应的-sourceList:...方法, NSOutlineView 将这两种方法都视为已实现(即使它们不是由您的数据源实现的),并且看起来 NSOutlineView 选择调用-outlineView:pasteboardWriterForItem:如果两者都是实施的。鉴于您没有sourceList:pasteboardWriterForItem:实现,-outlineView:pasteboardWriterForItem:返回的实现nil和您的其他方法不会被调用(您可以在此处查看代码。)

长话短说……

看起来现在你必须实现-sourceList:pasteboardWriterForItem:而不是-sourceList:writeItems:toPasteboard:(或者如果你的目标是< 10.7,也实现两者;在 10.6 及更低版本上,-sourceList:writeItems:toPasteboard:将被调用)。

实际上,我在使用运行时的作品中对 PXSourceList 进行了一些改进,并且应该解决这些问题,所以请密切关注GitHub上的项目!

于 2013-11-07T00:34:28.907 回答