无法拖放到NSCollectionView上工作

时间:2017-05-09 10:34:07

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

我正在制作一个简单的错误,但我无法将文件丢弃到NSCollectionView上,即使是以最基本的方式工作。

在测试项目中,我在窗口上有一个NSCollectionView,视图控制器是它的委托和数据源。我希望能够将文件从Finder拖到此集合视图中。

通过阅读文档,我所要做的就是:

注册拖动类型:

- (void)viewDidLoad {

    [super viewDidLoad];
    // Do any additional setup after loading the view.

    NSLog(@"Registering dragged types for collection view: %@", self.collectionView);
    [self.collectionView registerForDraggedTypes:@[NSFilenamesPboardType]];
    [self.collectionView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];
    [self.collectionView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
}

然后实现这两种方法:

-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id<NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation {

    NSLog(@"Validate drop: %@", draggingInfo);

    return NSDragOperationMove;
}

-(BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id<NSDraggingInfo>)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation {

    NSLog(@"Accept drop: %@", draggingInfo);

    return YES;
}

但是当我尝试将项目拖到集合视图上时,这两个方法都没有被调用,这让我觉得registerForDraggedTypes:调用没有按预期工作。

这里有什么问题?还有什么我需要研究的?

1 个答案:

答案 0 :(得分:6)

从OS X 10.11开始,NSCollectionViewDelegate方法采用索引路径而不是索引。例如

-(NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id<NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation

proposedIndex:参数替换为proposedIndexPath:

- (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id <NSDraggingInfo>)draggingInfo proposedIndexPath:(NSIndexPath * __nonnull * __nonnull)proposedDropIndexPath dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation