Странное поведение при использовании keyEquivalent на NSMenuItem - PullRequest
2 голосов
/ 03 апреля 2012

Я хотел иметь возможность установить 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

Почему это так?Есть идеи?

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Вы прошли в r или R? Я думаю, что если вы передадите ей строку в верхнем регистре, она автоматически добавит требование сдвига.

3 голосов
/ 03 апреля 2012

Звучит так, как будто вы передаете заглавную букву setKeyEquivalent:. Документы имеют следующее:

Обсуждение
Этот метод рассматривает случай передачи письма, чтобы определить, добавлен ли к нему модификатор Shift.Таким образом, [item setKeyEquivalent:@"w"] устанавливает ключ, эквивалентный Command-w, в то время как [item setKeyEquivalent:@"W"] - это Command-Shift-w.

Вам нужно будет немного больше обработать введенную строку,и убедитесь, что буква в нижнем регистре, если "SHIFT" не присутствует.

Вам также (в конечном итоге) следует подумать о том, чтобы быть более либеральным в принятом вводе - этот код не будет работать, если ввод "Shift "или" shift ", оба из которых являются разумными вариантами.

Я также думаю, что у вас есть ошибка / опечатка: ваше назначение на mask в ветви клавиш" Alt ", кажется, отсутствует OR:

mask = NSAlternateKeyMask;
// should be mask |= NSAlternateKeyMask;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...