NSCollectionView拖放:大多数代表事件未被调用

时间:2011-04-28 22:37:00

标签: objective-c cocoa macos drag-and-drop nscollectionview

我有一个绑定到NSArrayController的NSCollectionView。我想拖放工作,所以我创建一个委托并实现方法

-(BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent*)event
-(BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id < NSDraggingInfo >)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation
-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id < NSDraggingInfo >)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation
-(NSArray *)collectionView:(NSCollectionView *)collectionView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropURL forDraggedItemsAtIndexes:(NSIndexSet *)indexes

我为两个BOOL方法返回YES,为validateDrop:方法返回NSDragOperationMove,为namesOfPromisedFilesDroppedAtDestination:方法返回一个空数组。我还有一个NSLog语句作为每个方法的第一行,所以我可以看到它们何时被调用。

现在,唯一被调用的方法是canDragItemsAtIndexes :(其中我返回YES)。我看到它被调用,但任何进一步的拖动只会修改选择。其余的从未被召唤过。

如果我使NSCollectionView不支持选择,那么甚至不会调用该方法。

我确定我错过了一些非常明显的东西,但我无法弄清楚它是什么。有没有人使用NSCollectionViews进行拖放工作并且可以解决一些问题?

2 个答案:

答案 0 :(得分:4)

我想你错过了将阻力内容写入粘贴板的部分 要支持拖放,您必须执行以下步骤:

  1. 确定是否可以拖动拖动源
  2. 如果YES,请将内容写入“粘贴板”
  3. 验证&amp;接受放置目标中的项目
  4. 写入粘贴板应在实施中实施 - collectionView:writeItemsAtIndexes:toPasteboard:

    您还必须使用- registerForDraggedTypes:

    注册拖动的类型

    一些示例代码: http://developer.apple.com/library/mac/#samplecode/IconCollection/Introduction/Intro.html

答案 1 :(得分:0)

此代码包含将图像从一个NSCollectionView拖动到另一个NSCollectionView所需的一切。弄清楚这一点并不是非常明显。检查可选择的源集合视图并连接到dataSource和委托出口,但我不需要registerForDraggedTypes。

case Foo of
  fr_None: ;
  fr_Ok: ;
  fr_Fail: ;
  else
    raise Exception.Create('Not implemented');
end;