【问题标题】:Cannot get drag and drop to work onto NSCollectionView无法拖放以在 NSCollectionView 上工作
【发布时间】:2017-05-09 10:34:07
【问题描述】:

我可能犯了一个简单的错误,但我根本无法将文件拖放到 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: 调用没有按预期工作。

这可能是什么问题?我还需要研究什么?

【问题讨论】:

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


【解决方案1】:

从 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

【讨论】:

  • 谢谢。注意:Xcode 自动完成提示永远不会被调用的旧(错误)版本。它仍然存在于 NSCollectionView.h 中,并且虽然被标记为“旧”,但它并没有提到它不再起作用。
  • 这对于 macOS 10.14 仍然是个问题
猜你喜欢
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2021-10-31
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多