Я хотел иметь возможность установить keyEquivalent
для NSMenuItem
на основе NSString
, например: CMD + R , ALT + SHIFT + D и т. Д.
Для этого я создал метод в категории NSString
следующим образом (включая отладку NSLog
):
- (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;
}
}
Теперь я тестирую, используя CMD + R .
Вывод NSLog:
2012-04-03 10: 36: 19.051 Приложение [4654: 903] части :( CMD, R)
2012-04-03 10: 36: 19.052 Приложение [4654: 903] cmd
2012-04-03 10: 36: 19.052 Приложение [4654: 903] keyEq: {key = R;маска = 1048576;} - для бега
, который выглядит хорошо;mask=1048576
означает 1<<20
, что равно NSCommandKeyMask
.
Другими словами, он выглядит, как будто ключевой эквивалент ( Команда - R ) имеетбыло правильно истолковано.
Странная вещь, однако, в том, что, когда пункт меню наконец появляется, ключевой эквивалент, появляющийся рядом с "" Команда - SHIFT - R"....: -S
Почему это так?Есть идеи?