我有一个绑定到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进行拖放工作并且可以解决一些问题?
答案 0 :(得分:4)
我想你错过了将阻力内容写入粘贴板的部分 要支持拖放,您必须执行以下步骤:
YES
,请将内容写入“粘贴板”写入粘贴板应在实施中实施
- 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;