2013-02-10 3 views
2

При использовании флагов NSEventChanged и ANDing флаги с различными KeyMasks, как вы можете протестировать их эксклюзивным способом? В настоящее время, используя ряд, если в другом месте условия йот шаблон:Как вы можете захватывать только ключи-модификаторы?

if ((flags & someKeyMask) && (flags someOtherKeyMask)) 

Это будет соответствовать даже если третья клавиша-модификатор вниз. Ввод более длинной серии ключевых масок ранее в условиях if else приводит к тому, что поведение работает по желанию, но чувствует себя неполным как-то. Является ли хороший способ сказать «только эти ключи-модификаторы, а не другие»?

Вот более конкретный пример, где первый соответствует предыдущим. Мне интересно, есть ли способ добавить некоторую логику к каждому, который говорит «только эти ключи-модификаторы».

if ((flags & (NSCommandKeyMask|NSControlKeyMask))) { 
               NSLog(@"one"); 
              }else if (((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask)) && (flags & NSControlKeyMask)) { 
               NSLog(@"Command+Option+Control "); 
              } else if ((flags & NSCommandKeyMask) && (flags & NSShiftKeyMask)) { 
               NSLog(@"Command+Shift "); 
              } else if ((flags & NSCommandKeyMask) && (flags & NSControlKeyMask)) { 
               NSLog(@"Command+Control"); 
              } else if ((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask)) { 
               NSLog(@"Command+Option "); 
              } 

Так правильный образец, который я искал, как это предусмотрено Ken Томасами является: flags &= (<one or more masks bitwise OR'd together); if (flags == (<one or more masks bitwise OR'd together)) { // do something }

Это дает исключительное согласование.

ответ

6

Во-первых, вы должны знать, что значение, возвращаемое с -modifierFlags, включает в себя некоторые флаги, которые точно не соответствуют клавишам. Вы должны создать маску, которая включает в себя все флаги, которые вас волнуют (независимо от того, вы их или не нажали). Передайте значение флагов через эту маску, а затем сравните результат с той комбинацией, которую вы хотите.

Например, если вы заботитесь о Command, Option, Shift и Control, и вы хотите знать, если точно Command и сдвиг вниз, а другие нет, вы можете использовать:

if ((flags & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) == (NSShiftKeyMask|NSCommandKeyMask)) 
    // do something 

Обновление: Вот как проверить различные комбинации:

flags &= NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask; 
if (flags == (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) 
    NSLogs(@"Command+Option+Control"); 
else if (flags == (NSShiftKeyMask|NSCommandKeyMask)) 
    NSLog(@"Command+Shift "); 
else if (flags == (NSControlKeyMask|NSCommandKeyMask)) 
    NSLog(@"Command+Control"); 
else if (flags == (NSAlternateKeyMask|NSCommandKeyMask)) 
    NSLog(@"Command+Option "); 
+0

Да, это не проблема. Проблема в том, что если if ((flags & (NSShiftKeyMask | NSControlKeyMask)) предшествует этому в серии if-else, он совпадает даже с той же последовательностью клавиш-модификаторов. – uchuugaka

+1

Вы должны только проверить, какие именно комбинации вы хотите. Если у вас действительно есть два условия, которые не являются взаимоисключающими, тогда вы должны решить, как вы хотите справиться с этим (делайте то и другое, делайте только A, делайте только B, не делайте ни того) и, соответственно, напишите свой код. Возможно, я не понимаю что-то, но это звучит как старая шутка: «Доктор, когда я так двигаю рукой, это больно». «Ну, тогда не делай этого». Иными словами: все ваши условия должны быть в форме Я показал и не написал ни одной формы, которую вы написали. –

+0

Я обновил свой ответ с расширенным примером, аналогичным тому, что было в вашем вопросе (хотя ваш вопрос имеет избыточный случай). –

0

для того, чтобы поймать только комбинация нажатия, вы должны использовать конструкцию выключателя/останова:

switch (flags) { 
      case (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-alt-ctrl-"]; 
       break; 
      case (NSShiftKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-shift-"]; 
       break; 
      case (NSControlKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-ctrl-"]; 
       break; 
      case (NSAlternateKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-alt-"]; 
       break; 
      default: 
       break; 
     } 
Смежные вопросы