在NSMenuItem上使用keyEquivalent的奇怪行为

时间:2012-04-03 07:45:56

标签: objective-c cocoa keyboard-shortcuts nsmenuitem

我希望能够根据keyEquivalent设置NSMenuItem的{​​{1}},例如: CMD + R ALT + SHIFT + D

为此,我在NSString类别中创建了一个方法,如下所示(包括调试NSString):

NSLog

现在,我正在使用 CMD + R 进行测试。

NSLog输出为:

  

2012-04-03 10:36:19.051 App [4654:903]部分:(       CMD,       R)

     

2012-04-03 10:36:19.052 App [4654:903] cmd

     

2012-04-03 10:36:19.052 App [4654:903] keyEq:{       key = R;       mask = 1048576; } - 用于运行

看起来不错; - (NSDictionary*)toKeyEquivalent { NSMutableDictionary* result = [NSMutableDictionary dictionary]; NSArray* parts = [self componentsSeparatedByString:@"+"]; NSLog(@"parts :%@",parts); if ([[parts objectAtIndex:0] isEqualToString:@""]) { return [NSDictionary dictionaryWithObjectsAndKeys:@"",@"key",[NSNumber numberWithInt:0],@"mask", nil]; } else { [result setValue:[parts lastObject] forKey:@"key"]; int mask = 0; for (NSString* p in parts) { if ([p isEqualToString:@"CMD"]) { NSLog(@"cmd"); mask |= NSCommandKeyMask; } else if ([p isEqualToString:@"SHIFT"]) { NSLog(@"shift"); mask |= NSShiftKeyMask; } else if ([p isEqualToString:@"CTRL"]) { NSLog(@"ctrl"); mask |= NSControlKeyMask; } else if ([p isEqualToString:@"ALT"]) { NSLog(@"alt"); mask = NSAlternateKeyMask; } } [result setValue:[NSNumber numberWithInt:mask] forKey:@"mask"]; return result; } } 表示mask=1048576,等于1<<20

换句话说,它就像正确解释了等效键( Command - R )一样。

但奇怪的是,当菜单项最终出现时,旁边出现的Key Equivalent是“ Command - SHIFT - R “....: - S

为什么?有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您是否传递了rR?我想如果你传递一个大写字符串,它会自动添加转换要求。

答案 1 :(得分:3)

听起来你正在向setKeyEquivalent:传递一个大写字母。 The docs有这样的说法:

  

讨论
  此方法考虑传递的字母大小写,以确定是否添加了Shift修饰符。也就是说,[item setKeyEquivalent:@"w"]设置等效于Command-w的键,而[item setKeyEquivalent:@"W"]设置为Command-Shift-w。

您需要对输入的字符串进行更多处理,如果“SHIFT”不存在,请确保字母为小写。

你也应该(最终)考虑在你接受的输入中更自由 - 如果输入是“Shift”或“shift”,这个代码将不起作用,这两个都是合理的变化。

我还认为你有一个错误/错字:你在“Alt”键分支中对mask的分配似乎缺少了OR:

mask = NSAlternateKeyMask;
// should be mask |= NSAlternateKeyMask;