我在我的一个应用程序中使用了优秀的NSOutlineView子类PXSourceList。我正在尝试实现拖放到我的PXSourceList实例。我有:
awakeFromNib中,将self设置为委托和数据源awakeFromNib中,注册拖动类型。writeItems: validateDrop: acceptDrop:和namesOfPromisedFilesDroppedAtDestination:方法,并在控制器的.h文件中声明它们由于某种原因,在(4)中实现的拖放方法根本没有触发。我试过:
PXSourceList实例的PXSourceList的另一个数据源方法中,它总是返回在awakeFromNib.中分配的适当拖动类型。PXSourceList视图实例并将其从除NSWindow实例之外的所有包含视图的所有视图中卸载--那里也没有运气。PXSourceList附带的示例应用程序--所有这些都是不需要修改的。因此,实际上,除了拖放方法之外,所有数据源方法都会被调用。它的行为就好像我还没有注册拖动类型一样,但是我知道我已经注册了,并且2)实例响应它是为我设置的拖放类型注册的。
有什么想法吗?
发布于 2013-11-07 00:34:28
不幸的是,这是PXSourceList实现方式的副作用;如果您查看PXSourceList.m,它使自己成为自己的委托和数据源(因为它继承自NSOutlineView),实现了所有的大纲视图委托和数据源方法,当每个方法被调用时,它会调用实际的委托和数据源的实现,这些委托和数据源由PXSourceList与PXSourceListDelegate和PXSourceListDataSource方法一起使用。当我构建PXSourceList时,背后的原因是要有一个一致的API,而不是将NSOutlineViewDelegate/DataSource方法与PXSourceListDelegate/DataSource的其他方法(用于徽章和图标等)混合和匹配。
10.7SDK(我假设您正在使用)在NSOutlineViewDataSource中添加了一些额外的拖放方法。特别是在这里,NSOutlineViewDataSource获得了-outlineView:pasteboardWriterForItem:添加的附加方法,这是-outlineView:writeItems:toPasteboard:的一个替代方法。
当您启动拖动时,NSOutlineView查询数据源(通过使用-respondsToSelector:)来确定它实现的这些方法中的哪个以及要调用的方法中的哪一个。考虑到PXSourceList实现了这两种方法,并在实际数据源上调用了相应的-sourceList:...方法,NSOutlineView认为这两种方法都已实现(即使它们不是由数据源实现的),而且如果这两种方法都实现了,NSOutlineView似乎会选择调用-outlineView:pasteboardWriterForItem:。考虑到您没有sourceList:pasteboardWriterForItem:的实现,-outlineView:pasteboardWriterForItem:的实现将返回nil,而其他方法不会被调用(您可以看到代码这里)。
长话短说..。
现在看来,您必须实现-sourceList:pasteboardWriterForItem:而不是-sourceList:writeItems:toPasteboard: (或者如果您的目标也是< 10.7,那么实现两者;在10.6和更低的版本中,将调用-sourceList:writeItems:toPasteboard: )。
实际上,我在使用运行时的工作中对PXSourceList进行了一些改进,并且应该修复类似的问题,所以请关注项目论GitHub!
https://stackoverflow.com/questions/19665307
复制相似问题