当前位置:  开发笔记 > 运维 > 正文

Cocoa不会捕获Shift Shift修饰符?

如何解决《Cocoa不会捕获ShiftShift修饰符?》经验,为你挑选了1个好方法。

我有一个应用程序,我正在尝试捕获shift键修改器来执行一个动作,但是当我运行程序并按下而没有Shift键修改器的普通键时,我会发出一声嘟嘟声并且修改器和键不会被发送到我的keyDown事件.相关代码是:

NSString* eventChars = [theEvent charactersIgnoringModifiers];

if ([eventChars isEqualTo:@"w"]) {
    newPlayerRow++;
    direction = eUp;
} else if ([eventChars isEqualTo:@"x"]) {
    newPlayerRow--;
    direction = eDown;
} else if ([eventChars isEqualTo:@"a"]) {
    newPlayerCol--;
    direction = eLeft;
} else if ([eventChars isEqualTo:@"d"]) {
    newPlayerCol++;
    direction = eRight;
} else {
    [super keyDown:theEvent];
    return;
}

// handle the player firing a bullet
if (([theEvent modifierFlags] & (NSShiftKeyMask | NSAlphaShiftKeyMask)) != 0) {
    NSLog(@"Shift key");
    [self fireBulletAtColumn:newPlayerCol row:newPlayerRow inDirection:direction];
    [self setNeedsDisplay:YES];
} else {
    ...
}

我不确定是什么导致这种情况,但我希望能够捕获换档按键.在此先感谢您对此问题的任何帮助.

编辑:我也使用MacBook键盘,如果这有任何区别.

编辑:这绝对是一个以移位为中心的问题,因为改变(NSShiftKeyMask | NSAlphaShiftKeyMask)到NSControlKeyMask确实有所需的效果.



1> Boaz Stuller..:

首先,-charactersIgnoringModifiers不会忽略shift键,因此您仍然会从中返回移位的字符(即UPPERCASE和!%#$%^&*).你的函数可能会发生什么:你按shift-w,你的-isEqualTo:返回false,因为你正在比较一个小写的'w'和一个大写的'W',所以你在得到移位检测代码之前返回底部.最简单的解决方案就是检查两者.

但是,如果你想要的,例如,阿拉伯语键盘手能够很容易地使用你的应用程序,你真的不应该硬编码甚至可能不会出现在用户的键盘上的字符.-keyCode返回的值是指键在键盘上的位置,而不是表示的字符.对于初学者来说,常量开始在"kVK_ANSI_"和Events.h"kVK_"(您可能需要链接到Carbon.framework和的#include <碳/ Carbon.h>使用这些常量)可以比作什么-keyCode返回,它们指的是QWERTY使用美国人期望的关键位置.所以,你可以(美丽的)肯定的是,无论键盘布局,为"WASD"(kVK_ANSI_W,kVK_ANSI_A等)的键码将指三角形在用户的键盘的左上方.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有