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
实例。我有:

  • 将IB中的代理和数据源出口连接到我的控制器
  • 在控制器的
    awakeFromNib
    中,将self设置为委托和数据源
  • 在控制器的
    awakeFromNib
    中,为拖动类型注册
  • 在控制器中,实现必要的
    写入项:validateDrop:acceptDrop:
    namesOfPromisedFilesDroppedAtDestination:
    方法,并在控制器的.h文件中声明它们
  • 出于某种原因,(4)中实现的拖放方法根本不触发。我试过:

    • 将日志语句放置在拖放数据源方法中-它们永远不会被调用
    • 将log语句放入另一个数据源方法中,该方法记录
      PXSourceList
      实例的
      RegisteredDragedTypes
      ——它始终返回
      awakeFromNib中指定的正确拖动类型。
    • 获取
      PXSourceList
      视图实例,并将其从除NSWindow实例之外的所有包含视图中取消嵌入-在那里也没有运气
    • 将粘贴数据源代码从我的应用程序复制到
      PXSourceList
      附带的示例应用程序中-所有这些都可以正常工作,无需修改
    • 将工作代码从示例应用程序复制粘贴到SK源代码中-这不起作用
    因此,本质上,除了拖放方法之外,所有数据源方法都会被调用。它的行为就像我没有为拖动的类型注册一样,但是1)我知道我已经注册了,2)实例响应它为我设置的拖动类型注册了


    有什么想法吗?

    不幸的是,这是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做了一些改进,应该可以解决这些问题,所以请关注这个项目

    基本上,当您在表外或表内拖放时,您希望执行的操作??