我在我的一个应用程序中使用了优秀的NSOutlineView
子类PXSourceList
。我正在尝试拖放到我的PXSourceList
实例。我有:
awakeFromNib
中,将self设置为委托和数据源awakeFromNib
中,已注册为拖动类型writeItems: validateDrop: acceptDrop:
和
namesOfPromisedFilesDroppedAtDestination:
方法并在控制器的.h文件中声明它们由于某种原因,(4)中实现的拖放方法根本没有触发。我试过了:
registeredDraggedTypes
实例的PXSourceList
的其他数据源方法之一中 - 它始终返回awakeFromNib.
PXSourceList
视图实例,并从除NSWindow实例之外的所有包含视图中取消它 - 在那里也没有运气。PXSourceList
附带的示例应用程序 - 所有这些都无需修改即可使用。所以基本上我就是在除了拖放方法之外调用所有数据源方法的地方。它表现得像我没有注册拖动类型,但是1)我知道我有2)实例响应它是为我设置的拖动类型注册的。
有什么想法吗?
答案 0 :(得分: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实现两者,并在实际数据源上调用相应的-sourceList:...
方法,NSOutlineView将这两种方法视为已实现(即使它们不是由您的数据源提供) ,如果两者都实现了,似乎NSOutlineView选择调用-outlineView:pasteboardWriterForItem:
。鉴于您没有sourceList:pasteboardWriterForItem:
的实现,-outlineView:pasteboardWriterForItem:
的实现会返回nil
并且您的其他方法不会被调用(您可以看到代码here 。)
现在看来你必须实现-sourceList:pasteboardWriterForItem:
而不是-sourceList:writeItems:toPasteboard:
(如果你的目标是< 10.7,也要实现两者;在10.6及以下,{{1将被调用)。
我实际上对使用运行时的工作中的PXSourceList进行了一些改进,并且应该修复这些问题,所以请密切关注项目on GitHub!