我有一个 NSCollectionView 绑定到一个 NSArrayController。我想让拖放工作,所以我创建一个委托并实现
-(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 进行拖放操作并可以阐明一些情况?
I have an NSCollectionView bound to an NSArrayController. I want to get drag and drop working, so I create a delegate and implement the methods
-(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
I'm returning YES for the two BOOL methods, NSDragOperationMove for the validateDrop: method, and an empty array for the namesOfPromisedFilesDroppedAtDestination: method. I also have an NSLog statement as the first line in each method so I can see when they get called.
Right now, the only method that gets called is canDragItemsAtIndexes: (where I return YES). I see that it gets called, but any further dragging just modifies the selection. The rest never get called.
If I make the NSCollectionView not support selections, then not even that method gets called.
I'm sure I'm missing something super obvious, but I can't figure out what it is. Has anyone gotten drag and drop working with NSCollectionViews and can shed some light?
发布评论
评论(2)
我认为您错过了将拖动内容写入粘贴板的部分。
要支持拖放,您必须执行以下步骤:
YES
,则将内容写入粘贴板写入粘贴板应在
中实现
<代码>- collectionView:writeItemsAtIndexes:toPasteboard:
您还必须使用
- registerForDraggedTypes:
一些示例代码:
http://developer.apple.com/library/mac/ #samplecode/IconCollection/Introduction/Intro.html
I think you miss the part where you write the drag content to the pasteboard.
To support drag and drop you have to perform the following steps:
YES
, write the content to the PasteboardWriting to the Pasteboard should be implemented in
- collectionView:writeItemsAtIndexes:toPasteboard:
You also have to register your dragged types with
- registerForDraggedTypes:
Some sample code:
http://developer.apple.com/library/mac/#samplecode/IconCollection/Introduction/Intro.html
这段代码包含了将图像从一个 NSCollectionView 拖动到另一个 NSCollectionView 所需的一切。弄清楚这一点并不是很明显。检查源集合视图的 Selectable 并连接数据源和委托出口,但我不需要 registerForDraggedTypes。
This code has everything I needed to drag an image from one NSCollectionView to another. Figuring this out was NOT super obvious. Selectable is checked for the source collection view and wired up for the dataSource and delegate outlets, but I did not need registerForDraggedTypes.