2012-06-22 3 views
6

Я хочу установить эквивалент ключа "" (пробел) без каких-либо модификаторов для NSMenuItem (в главном меню приложения).NSMenuItem KeyEquivalent Ошибка «" (пробел)

Как следует из документации:

Например, в приложении, которое играет СМИ, команда воспроизведения может отображаться только «» (пробел), без ключа командной строки. Вы можете сделать это со следующим кодом:

[menuItem setKeyEquivalent: @ ""];

[menuItem setKeyEquivalentModifierMask: 0];

Ключ Эквивалентный набор успешно, но он не работает. Когда я нажимаю клавишу «Пробел» без модификаторов, ничего не происходит, но это работает, когда я нажимаю «Пробел» с помощью клавиши модификатора «Fn».

Мне нужно использовать «Пространство» без модификаторов. Любая помощь пожалуйста!

ответ

3

У меня была та же проблема. Я не очень много исследовал, но, насколько я могу судить, пробел не «выглядит» как комбинация клавиш с Cocoa, поэтому он перенаправляется на -insertText:. Мое решение было подкласс NSWindow, поймать его, как он идет вверх ответчик цепи (предположительно можно создать подкласс NSApp вместо этого), и отправить его в систему меню в явном виде:

- (void)insertText:(id)insertString 
{ 
    if ([insertString isEqual:@" "]) { 
     NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
               location:[self mouseLocationOutsideOfEventStream] 
             modifierFlags:0 
              timestamp:[[NSProcessInfo processInfo] systemUptime] 
              windowNumber:self.windowNumber 
               context:[NSGraphicsContext currentContext] 
              characters:@" " 
          charactersIgnoringModifiers:@" " 
              isARepeat:NO 
               keyCode:49]; 
     [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
    } else { 
     [super insertText:insertString]; 
    } 
} 
+0

Спасибо вам ответить, он работает) – Kira

1

Я только испытывал то же самое проблема с твист ...

Эквивалент ключа пробела отлично работает в моем приложении, в то время как связанное IBS-соединение NSMenuItem находится в App Delegate.

Если я переведу IBAction в выделенный контроллер, он терпит неудачу. Все остальные эквиваленты ключей меню продолжают работать, но пробел не отвечает (это нормально с ключом-модификатором, но немодифицированный @ "" не будет работать).

Я пробовал различные обходные пути, например, связывание непосредственно с контроллером и привязка через цепочку ответчиков, но безрезультатно. Я попробовал код так:

[menuItem setKeyEquivalent:@" "]; 
[menuItem setKeyEquivalentModifierMask:0]; 

и путь Interface Builder, поведение такое же

Я попытался подклассов NSWindow, согласно ответу Джастина, но до сих пор не удалось получить, чтобы работать.

Так что пока я сдал и переместил этот IBAction в делегат приложения, где он работает. Я не рассматриваю это как решение, просто делаю ... возможно, это ошибка, или (более вероятно) я просто не понимаю сообщения событий и цепочку ответчиков достаточно хорошо.

1

Это сообщение, потому что мне тоже нужно использовать пространство, но ни один из этих решений не работает для меня.

Так, I subclass NSApplication и использовать селектор sendEvent: с justin k solution:

- (void)sendEvent:(NSEvent *)anEvent 
{ 
    [super sendEvent:anEvent]; 
    switch ([anEvent type]) { 
    case NSKeyDown: 
     if (([anEvent keyCode] == 49) && (![anEvent isARepeat])) { 

      NSPoint pt; pt.x = pt.y = 0; 
      NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
                location:pt 
              modifierFlags:0 
               timestamp:[[NSProcessInfo processInfo] systemUptime] 
               windowNumber: 0 // self.windowNumber 
                context:[NSGraphicsContext currentContext] 
               characters:@" " 
           charactersIgnoringModifiers:@" " 
               isARepeat:NO 
                keyCode:49]; 
      [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
     } 
     break; 

    default: 
     break; 
    } 
} 

Надеется, что это поможет

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