objective-c - NSCollectionView 拖放 : Most Delegate Events Not Getting Called

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

我有一个 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 时进行过拖放操作并且可以阐明一些问题?

最佳答案

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

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

写入粘贴板应该在
中实现 - 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/

相关文章:

ios - 以编程方式在 iOS 上滚动 UIWebView

iphone - 更改 View 大小后 tableview 消失

macos - 调整 NSWindow 大小以匹配 Storyboard 中的 View Controller 大小

objective-c - 获取日期与 [NSDate date] 相差几个小时

macos - 如何从歌曲文件中获取歌曲的歌词

macos - 使用 Swift 在 OS X 应用程序中打开一个新窗口

cocoa - 是否可以更换 Mac 登录屏幕?

objective-c - 在 Objective-C 中我可以将属性视为数组吗?

php - 在 Mac Mini lion 服务器上从源代码编译 PHP 失败

ios - 如何使用 Objective-C 绑定(bind) ReactiveCocoa 中的结构