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

-(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一起工作的资料,可以阐明一些想法?

最佳答案

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

  • 确定是否可以拖动拖动源
  • 如果为YES,则将内容写入粘贴板
  • 验证并接受您的放置目标
  • 中的项目

    写入粘贴板应在
    - collectionView:writeItemsAtIndexes:toPasteboard:

    您还必须向 - registerForDraggedTypes: 注册拖动的类型

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

    关于objective-c - NSCollectionView拖放: Most Delegate Events Not Getting Called,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5825833/

    10-09 06:30
    查看更多