Wie Pfeiltasten-Ereignis in Cocoa app zu behandeln?
Antworten
Zu viele Anzeigen?Siehe diesen Code. Ich nahm an, die Klasse sei eine Unterklasse von NSView
.
#pragma mark - NSResponder
- (void)keyDown:(NSEvent *)theEvent
{
NSString* const character = [theEvent charactersIgnoringModifiers];
unichar const code = [character characterAtIndex:0];
switch (code)
{
case NSUpArrowFunctionKey:
{
break;
}
case NSDownArrowFunctionKey:
{
break;
}
case NSLeftArrowFunctionKey:
{
[self navigateToPreviousImage];
break;
}
case NSRightArrowFunctionKey:
{
[self navigateToNextImage];
break;
}
}
}
Eine Ansicht sollte ein erster Ansprechpartner für den Empfang von Ereignissen sein. Vielleicht wird dieser Code erforderlich sein, um dies zu unterstützen.
#pragma mark - NSResponder
- (BOOL)canBecomeKeyView
{
return YES;
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
Um diese Methode zu verwenden, sollte die Klasse eine Unterklasse von NSResponder
. Siehe die andere Antwortbehandlung ohne Unterklassifizierung von NSResponder.
In meinem Fall wollte ich eine präsentierte NSViewController-Unterklasse, die in der Lage ist, mit minimalem Aufwand auf Pfeiltastenereignisse zur Navigation zu reagieren. Hier ist die beste Lösung, die ich gefunden habe, eine leichte Variation von Josh Caswells Antwort.
Definieren Sie einen Ereignismonitor (optional), kann lokal in Ihrer NSViewController-Unterklasse .m sein
id keyMonitor;
Dann beginnen Sie mit der Überwachung von Ereignissen, zum Beispiel in viewDidLoad.
keyMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *event) {
unichar character = [[event characters] characterAtIndex:0];
switch (character) {
case NSUpArrowFunctionKey:
NSLog(@"Up");
break;
case NSDownArrowFunctionKey:
NSLog(@"Down");
break;
case NSLeftArrowFunctionKey:
NSLog(@"Left");
break;
case NSRightArrowFunctionKey:
NSLog(@"Right");
break;
default:
break;
}
return event;
}];
So entfernen Sie den Monitor, wenn er nicht benötigt wird (vorausgesetzt, Sie haben ihn definiert)
[NSEvent removeMonitor:keyMonitor];