NSCollectionView:如何防止右键单击选择?

时间:2019-07-13 09:16:35

标签: swift xcode macos cocoa nscollectionview

在我的应用程序中,我有一个带有自定义CollectionViewItem的NSCollectionView。它用于显示图像。我具有“允许多项选择”选项,并且可以用鼠标选择多个项目。

但是,对于NSCollectionView,我还有一个右键单击时会打开的ContextMenu。但是,如果我单击一个项目,我的选择将会丢失。只有我单击的项目会被标记。我不要我想打开上下文菜单,并保留几个项目的选择。仅当我在两个项目之间单击而不是在一个项目上单击时,这才有效。

如何通过右键单击项目来阻止选择?

更新

上下文菜单是通过Interface Builder实现的。我将其拖动到与CollectionView的菜单出口相连的ViewController上。

1 个答案:

答案 0 :(得分:0)

我还没有机会进行测试或优化(忙碌的一天,对不起),但是我认为您可以按照这种方式去做。设置集合视图委托,并添加collectionView:shouldSelectItemsAtIndexPaths:和/或collectionView:shouldDeselectItemsAtIndexPaths:方法(虽然似乎很可能不确定我是否需要同时使用这两种方法)。然后添加一个用于测试当前事件的例程,以查看是否单击鼠标右键:

- (NSSet<NSIndexPath *> *)collectionView:(NSCollectionView *)collectionView shouldDeselectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths {
    return ([self testForRightClick]) ? indexPaths : [NSSet set];
}

- (NSSet<NSIndexPath *> *)collectionView:(NSCollectionView *)collectionView shouldSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths {
    return ([self testForRightClick]) ? indexPaths : [NSSet set];
}

- (BOOL)testForRightClick {
    NSEvent * currentEvent;

    currentEvent = [NSApp currentEvent];
    return (currentEvent.type == NSEventTypeRightMouseDown ||
            currentEvent.type == NSEventTypeRightMouseUp) ? NO : YES;
}

对于任何其他类型的事件,此命令将直接发送保留选择/取消选择请求的NSSet,但是如果该事件是鼠标右键向上/向下事件,则它将返回一个空集,该空集应阻止任何取消选择或新选择。