【问题标题】:NSOutlineView subclass not firing data source drag and drop methodsNSOutlineView 子类不触发数据源拖放方法
【发布时间】:2013-10-29 17:33:51
【问题描述】:
我在我的一个应用程序中使用了出色的NSOutlineView 子类PXSourceList。我正在尝试实现拖放到我的PXSourceList 实例。我有:
- 将 IB 中的委托和数据源出口连接到我的控制器
- 在控制器的
awakeFromNib中,将self设置为委托和数据源
- 在控制器中的
awakeFromNib中,为拖拽类型注册
- 在控制器中,实现了必要的
writeItems: validateDrop: acceptDrop: 和
namesOfPromisedFilesDroppedAtDestination: 方法并在控制器的 .h 文件中声明它们
由于某种原因,(4) 中实现的拖放方法根本没有触发。我试过了:
- 将日志语句放在拖放数据源方法中 - 它们永远不会被调用。
- 将日志语句放入记录
PXSourceList 实例的registeredDraggedTypes 的其他数据源方法之一 - 它始终返回在awakeFromNib. 中分配的正确拖动类型
- 获取
PXSourceList 视图实例并将其从除 NSWindow 实例之外的所有包含视图中取消嵌入 - 也没有运气。
- 将数据源代码从我的应用程序复制粘贴到
PXSourceList 附带的示例应用程序中 - 无需修改即可全部运行。
- 将示例应用程序中的工作代码复制粘贴到 SK 源中 - 不起作用。
所以基本上我处于调用所有数据源方法的位置,除了拖放方法。它的行为就像我没有为拖动类型注册一样,但是 1)我知道我有,并且 2)实例响应它已为我设置的拖动类型注册。
有什么想法吗?
【问题讨论】:
标签:
objective-c
cocoa
drag-and-drop
nsoutlineview
pxsourcelist
【解决方案1】:
不幸的是,这是 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 并且您的其他方法不会被调用(您可以查看代码here。)
长话短说……
现在看来,您必须实现 -sourceList:pasteboardWriterForItem: 而不是 -sourceList:writeItems:toPasteboard:(或者如果您的目标也是 -sourceList:writeItems:toPasteboard:)。
实际上,我在使用运行时的作品中对 PXSourceList 进行了一些改进,应该可以解决这些问题,所以请密切关注 on GitHub 项目!