我有一个 NSCollectionView 绑定(bind)到一个 NSArrayController。我想让拖放工作正常进行,所以我创建了一个委托(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/