gpt4 book ai didi

objective-c - NSOutlineView 子类不触发数据源拖放方法

转载 作者:行者123 更新时间:2023-12-03 17:40:04 26 4
gpt4 key购买 nike

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

  1. 将 IB 中的委托(delegate)和数据源导出连接到我的 Controller
  2. 在 Controller 的awakeFromNib中,将self设置为委托(delegate)和数据源
  3. 在 Controller 的awakeFromNib中,为拖动类型注册
  4. 在 Controller 中,实现了必要的 writeItems: validateDrop:acceptDrop:namesOfPromisedFilesDroppedAtDestination: 方法并在 Controller 的 .h 文件中声明它们

由于某种原因,(4) 中实现的拖放方法根本没有触发。我试过:

  • 将日志语句放置在拖放数据源方法中 - 它们永远不会被调用。
  • 将日志语句放入记录 PXSourceList 实例的 registeredDraggedTypes 的其他数据源方法之一 - 它始终返回在 中分配的正确拖动类型awakeFromNib。
  • 获取 PXSourceList View 实例并将其从除 NSWindow 实例之外的所有包含 View 中取消嵌入 - 那里也没有运气。
  • 将数据源代码从我的应用程序复制粘贴到 PXSourceList 附带的示例应用程序 - 无需修改即可运行。
  • 将示例应用程序中的工作代码复制粘贴到 SK 源中 - 它不起作用。

所以本质上我处于一个除了拖放方法之外的所有数据源方法都被调用的地方。它的行为就像我没有注册拖动类型,但是 1) 我知道我已经注册了,2) 实例响应说它已注册我设置的拖动类型。

有什么想法吗?

最佳答案

不幸的是,这是 PXSourceList 实现方式的副作用;如果你查看 PXSourceList.m 内部,它使自己成为自己的委托(delegate)和数据源(因为它继承自 NSOutlineView),实现所有大纲 View 委托(delegate)和数据源方法,并且当调用每个方法时,它会调用实现PXSourceList 通过 PXSourceListDelegate 和 PXSourceListDataSource 方法使用的实际委托(delegate)和数据源。当我构建 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 及更低版本上,将调用 -sourceList:writeItems:toPasteboard:)。

实际上,我在使用运行时的作品中对 PXSourceList 进行了一些改进,应该修复此类问题,因此请密切关注项目 on GitHub !

关于objective-c - NSOutlineView 子类不触发数据源拖放方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com