2010-05-20 62 views
0

我最近开始另一个没有账户的线程,所以我在这里重新发布一个账户的问题,所以我可以编辑当前链接到该程序,以便其他用户可以关注这个。我也更新了下面的代码。这是我原来的问题:可可NSOutlineView和拖放

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

+0

“我希望它接收到放在其上的文本文件”您是什么意思?在大纲视图中或在应用程序的Dock磁贴上放置? – 2010-05-24 05:57:27

+0

另外,不要忘记检查'[super init]'的结果。不要以为它成功了。你所有的'init'方法中的实例变量赋值应该在'if(self)'块内。 (您也可以将这个任务集成到条件中,这在Cocoa代码中很常见,但这取决于您的样式首选项。) – 2010-05-24 06:03:06

回答

8

你没有响应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 

通知选择器的第三组件的名称,并连同它的参数的类型和名称。

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