【问题标题】:NSOutlineView subclass not firing data source drag and drop methodsNSOutlineView 子类不触发数据源拖放方法
【发布时间】:2013-10-29 17:33:51
【问题描述】:

我在我的一个应用程序中使用了出色的NSOutlineView 子类PXSourceList。我正在尝试实现拖放到我的PXSourceList 实例。我有:

  1. 将 IB 中的委托和数据源出口连接到我的控制器
  2. 在控制器的awakeFromNib中,将self设置为委托和数据源
  3. 在控制器中的awakeFromNib中,为拖拽类型注册
  4. 在控制器中,实现了必要的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 项目!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多