我希望能够根据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
为什么?有什么想法吗?
答案 0 :(得分:5)
您是否传递了r
或R
?我想如果你传递一个大写字符串,它会自动添加转换要求。
答案 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;