无法拖放到 NSCollectionView 上
Cannot get drag and drop to work onto NSCollectionView
我可能犯了一个简单的错误,但即使以最基本的方式,我也无法将文件拖放到 NSCollectionView 上工作。
在一个测试项目中,我在 window 上有一个 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;
}
但是当我尝试将一个项目拖动到集合视图时,这两种方法中的 none 被调用,这让我认为 registerForDraggedTypes:
调用没有按预期工作。
这可能是什么问题?我还需要检查什么?
从 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
我可能犯了一个简单的错误,但即使以最基本的方式,我也无法将文件拖放到 NSCollectionView 上工作。
在一个测试项目中,我在 window 上有一个 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;
}
但是当我尝试将一个项目拖动到集合视图时,这两种方法中的 none 被调用,这让我认为 registerForDraggedTypes:
调用没有按预期工作。
这可能是什么问题?我还需要检查什么?
从 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