Objective c NSOutlineView子类未触发数据源拖放方法
我正在我的一个应用程序中使用优秀的Objective c NSOutlineView子类未触发数据源拖放方法,objective-c,cocoa,drag-and-drop,nsoutlineview,pxsourcelist,Objective C,Cocoa,Drag And Drop,Nsoutlineview,Pxsourcelist,我正在我的一个应用程序中使用优秀的NSOutlineView子类PXSourceList。我正在尝试实现拖放到我的PXSourceList实例。我有: 将IB中的代理和数据源出口连接到我的控制器 在控制器的awakeFromNib中,将self设置为委托和数据源 在控制器的awakeFromNib中,为拖动类型注册 在控制器中,实现必要的写入项:validateDrop:acceptDrop:和 namesOfPromisedFilesDroppedAtDestination:方法,并在控制器的
NSOutlineView
子类PXSourceList
。我正在尝试实现拖放到我的PXSourceList
实例。我有:
awakeFromNib
中,将self设置为委托和数据源awakeFromNib
中,为拖动类型注册写入项:validateDrop:acceptDrop:
和
namesOfPromisedFilesDroppedAtDestination:
方法,并在控制器的.h文件中声明它们- 将日志语句放置在拖放数据源方法中-它们永远不会被调用
- 将log语句放入另一个数据源方法中,该方法记录
实例的PXSourceList
——它始终返回RegisteredDragedTypes
awakeFromNib中指定的正确拖动类型。
- 获取
视图实例,并将其从除NSWindow实例之外的所有包含视图中取消嵌入-在那里也没有运气PXSourceList
- 将粘贴数据源代码从我的应用程序复制到
附带的示例应用程序中-所有这些都可以正常工作,无需修改PXSourceList
- 将工作代码从示例应用程序复制粘贴到SK源代码中-这不起作用
有什么想法吗?不幸的是,这是PXSourceList实现方式的副作用;如果您查看PXSourceList.m内部,它会使自己成为自身的委托和数据源(因为它继承自NSOutlineView),实现所有outline视图委托和数据源方法,并且在调用每一个方法时,它通过PXSourceListDelegate和PXSourceListDataSource方法调用PXSourceList正在使用的实际委托和数据源的实现。当我构建PXSourceList时,其背后的原因是要有一个一致的API,而不是将NSOutlineViewDelegate/DataSource方法与PXSourceListDelegate/DataSource的其他方法(用于徽章和图标等)混合和匹配 10.7SDK(我假设您正在使用)向NSOutlineViewDataSource添加了一些额外的拖放方法。特别是与此相关的是,NSOutlineViewDataSource添加了附加方法
-outlineView:pasteboardWriterForItem:
,它是-outlineView:writeItems:TopPasteBoard:
的替代方法
开始拖动时,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做了一些改进,应该可以解决这些问题,所以请关注这个项目 基本上,当您在表外或表内拖放时,您希望执行的操作??