gpt4 book ai didi

cocoa - 更改 NSCollectionView 的选择行为

转载 作者:行者123 更新时间:2023-12-03 17:11:01 25 4
gpt4 key购买 nike

在我的 Mac 应用程序中,我有一个启用了多选的 NSCollectionView。在我的应用程序中,能够选择多个项目是常态,并且在单击选择多个项目时必须按 cmd,这让一些用户感到沮丧,并且大多数用户没有意识到他们可以做到这一点(我获得了很多功能要求多选的请求)

所以,我想改变行为:

  • 当用户单击第二个项目时,第一个项目保持选中状态(无需按住 cmd)
  • 当用户点击所选项目时,该项目将被取消选择

我尝试在我自己的 NSCollectionViewItem 子类上重写 setSelected,如下所示:

-(void)setSelected:(BOOL)flag
{
[super setSelected:flag];
[(MyView*)[self view] setSelected: flag];
[(MyView*)[self view] setNeedsDisplay:YES];
}

需要调用 super setSelected 来确保 Collection View 正常运行,但这似乎也是导致默认行为的原因。

我应该做什么?

最佳答案

您可以尝试使用本地事件监视器拦截所有鼠标左键按下事件。在此 block 中,您可以计算出点击是否发生在您的 Collection View 上。如果确实如此,请创建一个新事件来模仿您拦截的事件,但如果命令键掩码尚不存在,则将其添加到其中。然后,在 block 的末尾返回您的事件,而不是您拦截的事件。您的 Collection View 的行为就像用户按下了命令键一样,即使他们没有!

我在一个非常简单的演示应用程序中快速尝试了这一点,它看起来是一种很有前途的方法 - 尽管我希望您在此过程中必须解决一些陷阱

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {


[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskFromType(NSLeftMouseDown)
handler:^NSEvent *(NSEvent *originalEvent) {

// Did this left down event occur on your collection view?
// If it did add in the command key

NSEvent *newEvent =
[NSEvent
mouseEventWithType: NSLeftMouseDown
location: originalEvent.locationInWindow
modifierFlags: NSCommandKeyMask // I'm assuming it's not already present
timestamp: originalEvent.timestamp
windowNumber: originalEvent.windowNumber
context: originalEvent.context
eventNumber: originalEvent.eventNumber
clickCount: originalEvent.clickCount
pressure:0];

return newEvent; // or originalEvent if it's nothing to do with your collection view
}];
}

编辑(按问题作者):

这个解决方案在很大程度上基于原始答案,因此这个答案值得赞扬(随意编辑)

您还可以通过子类化 NSCollectionView 类并重写 mousedown 来拦截鼠标事件,如下所示:

@implementation MyCollectionView

-(void) mouseDown:(NSEvent *)originalEvent {

NSEvent *mouseEventWithCmd =
[NSEvent
mouseEventWithType: originalEvent.type
location: originalEvent.locationInWindow
modifierFlags: NSCommandKeyMask
timestamp: originalEvent.timestamp
windowNumber: originalEvent.windowNumber
context: originalEvent.context
eventNumber: originalEvent.eventNumber
clickCount: originalEvent.clickCount
pressure: originalEvent.pressure];

[super mouseDown: mouseEventWithCmd];
}

@end

关于cocoa - 更改 NSCollectionView 的选择行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com