【问题标题】:NSCollectionView : How to prevent right click selection?NSCollectionView:如何防止右键选择?
【发布时间】:2019-11-22 20:37:25
【问题描述】:

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

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

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

更新

上下文菜单是通过 Interface Builder 实现的。我将它拖到 ViewController 上,将它与 CollectionView 的菜单插座连接起来。

【问题讨论】:

  • 上下文菜单是如何实现的?
  • 如何在小型测试项目中重现问题?我试过了,右键单击时选择没有改变。

标签: swift xcode macos cocoa nscollectionview


【解决方案1】:

我还没有机会测试或改进它——忙碌的一天,抱歉——但我认为你可以通过这种方式到达你要去的地方。设置集合视图委托,并添加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,但如果事件是鼠标右键向上/向下事件,它会返回一个空集,它应该阻止任何取消选择或新的选择。

【讨论】:

  • 你的上下文菜单是如何实现的,shouldDeselectItemsAtIndexPaths 是在右键单击时调用的吗? testForRightClick 是否返回 NO 以进行右键单击?
  • 我自己还没有测试过这个答案——我必须找到或创建一个coolectionView项目,因为我手头没有——但是上下文菜单的实现方式应该是无关紧要的. collView 将在选择或取消选择之前调用委托。他的实现显然是在调用菜单时调用“取消选择”;此代码在委托中将其取消。
  • @Willeke:想想看,你对实现的看法可能是对的。我不知道右键单击是否通常会更改集合视图中的选择(尽管在我看来它不应该)。他可能错误地实现了上下文菜单。但除非他愿意分享这些信息……
猜你喜欢
  • 2019-08-29
  • 1970-01-01
  • 2022-01-09
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多