Во-первых, -charactersIgnoringModifiers не игнорирует клавишу Shift, поэтому вы все равно получите сдвинутые символы (т. Е. UPPERCASE и!% # $% ^ & *), Возвращенные из него. Вероятно, что происходит в вашей функции: вы нажимаете shift-w, ваш -isEqualTo: возвращает false, потому что вы сравниваете строчные буквы 'w' и прописные буквы 'W' и возвращаетесь, прежде чем перейти к коду обнаружения сдвига в дно. Самое простое решение - просто проверить оба.
Однако, если вы хотите, например, чтобы арабские клавишники могли легко использовать ваше приложение, вам не следует жестко кодировать символы, которые могут даже не отображаться на клавиатуре пользователя. Значение, возвращаемое параметром -keyCode, относится к положению клавиши на клавиатуре, а не к представленному символу. Для начала, константы, начинающиеся с 'kVK_ANSI_' и 'kVK_' в Events.h (вам может понадобиться ссылка на Carbon.framework и #include для использования этих констант) можно сравнить с тем, что -keyCode возвращается, и они ссылаются на ключевые позиции, которые ожидает использующий QWERTY американец. Таким образом, вы можете быть (довольно) уверены, что независимо от раскладки клавиатуры коды клавиш 'wasd' (kVK_ANSI_W, kVK_ANSI_A и т. Д.) Будут ссылаться на этот треугольник в верхнем левом углу клавиатуры вашего пользователя.