2012-04-03 4 views
2

Я хотел был бы установить keyEquivalentNSMenuItem на основе NSString, например. : ЦМД + R, ALT + SHIFT + D и т.д.Странное поведение с использованием keyEquivalent на NSMenuItem

Для этого я создал метод в 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 App [4654: 903] части :( CMD, R)

2012-04-03 10 : 36: 19.052 Приложение [4654: 903] cmd

2012-04-03 10: 36: 19.052 Приложение [4654: 903] keyEq: { ключ = R; mask = 1048576; } - для пробега

Какой выглядит хорошо; mask=1048576 означает 1<<20, что равно NSCommandKeyMask.

Другими словами, КАЖЕТСЯ, как если ключ эквивалент (Command - R) правильно интерпретированы.

Странная вещь, однако, является то, что, когда, наконец, появится пункт меню, ключ Эквивалент появляясь рядом с является «Command - SHIFT - R» ....: -S

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

ответ

5

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

+0

Святая корова ... Большое спасибо! Невероятно глупо меня; просто не мог даже представить, что что-то подобное могло иметь такой эффект ... Ты спас меня так много времени! :-) –

3

Похоже, что вы передаете прописную букву setKeyEquivalent:. The docs должны это сказать:

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

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

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

Я также думаю, что у вас есть ошибка/опечатка: ваше назначение mask в ключевой отрасли «Alt», кажется, отсутствует ИЛИ:

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

Спасибо большое! :-) –

+0

Будучи более ... «либералом» на моем входе, на самом деле не нужно, так как я в основном получаю вклад от «plist», который я создал, так что не имеет большого значения; Хорошая точка для 'NSAlternateKeyMask', хотя это действительно была опечатка (о ... вы не можете избежать их, как бы осторожны вы ...) ;-) –

+0

О, извините, это звучало так, будто вы получали строки от пользователя. –

Смежные вопросы