14 Stimmen

Wie Pfeiltasten-Ereignis in Cocoa app zu behandeln?

Wie Pfeiltasten-Ereignis in Cocoa app zu behandeln?

12voto

eonil Punkte 78964

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.

3voto

Daniel Nordh Punkte 600

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];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X