【问题标题】:Cocoa NSOutlineView and Drag-and-DropCocoa NSOutlineView 和拖放
【发布时间】:2010-05-20 03:19:15
【问题描述】:

我最近在没有帐户的情况下启动了另一个线程,因此我在此处使用帐户重新发布问题,以便我可以编辑该程序的当前链接,以便其他用户可以关注此问题。我还更新了下面的代码。这是我最初的问题:

我在这里阅读了关于 Outlineviews 和 DND 的另一篇文章,但我无法让我的程序运行。这篇文章的底部是我的项目的 zip 链接。它非常基本,只有一个大纲视图和按钮。我希望它接收放置在上面的文本文件,但我的代码或连接有问题。我尝试遵循 Apple 的 NSOutline 拖放示例代码,但我遗漏了一些东西。 1 个不同之处是我的程序是基于文档的程序,而他们的示例不是。我将文件的所有者设置为接收委托操作,因为这是我处理拖放的代码以及按钮操作的位置。它可能是一个简单的错误,所以有人可以看看它并告诉我我做错了什么吗?这是文件的链接:http://dl.dropbox.com/u/7195844/OutlineDragDrop1.zip

【问题讨论】:

  • “我希望它接收放置在其上的文本文件” 你是什么意思?放在大纲视图上,还是放在应用程序的 Dock 磁贴上?
  • 另外,不要忘记检查[super init] 的结果。不要以为它成功了。您在init 方法中对实例变量的所有分配都应该在if (self) 块内。 (您也可以将赋值集成到条件中,这在 Cocoa 代码中很常见,但这取决于您的风格偏好。)

标签: cocoa drag-and-drop nsoutlineview


【解决方案1】:

您没有响应 NSOutlineView 的拖动验证消息。

Your original code 实现了tableView:validateDrop:proposedRow:proposedChildIndex:。正如我在那个问题上指出的那样,当您的表格视图是大纲视图时,这是错误的; NSOutlineView 不会发送表格视图拖动验证消息,只会发送大纲视图拖动验证消息。

您已经将拖动验证方法更改为如下声明:

- (NSDragOperation)outlineView:(NSOutlineView*)view
                validateDrop:(id <NSDraggingInfo>)info
                 proposedRow:(int)row
          proposedChildIndex:(NSInteger)index

但实际上并没有发送这样的消息。

请记住,NSOutlineView 很少处理行索引,因为这些索引会随着父行的展开和折叠而改变。它处理的是“项目”,通常是模型对象。

因此,正确的验证方法是:

- (NSDragOperation)outlineView:(NSOutlineView*)view
                validateDrop:(id <NSDraggingInfo>)info
                proposedItem:(id)item
          proposedChildIndex:(NSInteger)index

注意选择器的第三个组件的名称,以及随之而来的参数的类型和名称。

应用此更改后,您的数据源将验证 drop。

【讨论】:

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