2015-01-26 16 views
7

Próbuję znaleźć sposób na wykrycie, czy klawisz (na klawiaturze) został naciśnięty na Swift. Wszelkie pomysły i sugestie będą bardzo mile widziane.Wykrywanie zdarzenia naciśnięcia klawisza w Swift

+1

Co próbowałeś sam? –

+2

To nie jest duplikat. Odpowiedzi celu C nie są duplikatami dla pytań Swift. –

+0

W jakim kontekście chciałeś wykryć naciśnięcie klawisza? W oknie? Wejście? –

Odpowiedz

10

Ponieważ zaktualizowałeś swoje pytanie i chciałeś wiedzieć, jak to zrobić w oknie, oto odpowiedź. Podklasa NSWindow i zamiast tego użyj tej podklasy.

niestandardowej klasy powinien wyglądać następująco:

import Cocoa 

class EditorWindow: NSWindow { 
    override func keyDown(event: NSEvent) { 
     super.keyDown(event) 
     Swift.print("Caught a key down: \(event.keyCode)!") 
    } 
} 

Po dokonaniu okno w konstruktorze Interface/XCode, kliknij obiekt okna i przejść do atrybutu Inspector ( + +). Inspektor atrybutu będzie na pasku bocznym po prawej stronie. Upewniając się, że okno jest wybrane w Konstruktorze interfejsów, w górnej części Inspektora atrybutów w obszarze Custom Class umieść swoją nową klasę w danych wejściowych klasy.

Attribute Selector

W celu komunikowania się zdarzenie z klasy to okno do mojego app dodać funkcję do okna, które akceptuje funkcji zwrotnej, że następnie przechowywać w tablicy funkcji zwrotnych. Otrzymuję dostęp do tego okna poprzez AppDelegate, które może uzyskać słabe odniesienie do bieżącego okna głównego. Następnie w powyższej funkcji I iterować ogólnie wywołania zwrotne i wywołać je za pomocą argumentu NSEvent. Najpierw sprawdzam również, czy klawisze polecenia, takie jak klawisze opcji, są najpierw wciskane przez właściwość modifierFlags w wydarzeniu. Kończy się patrzy tak:

import Cocoa 

typealias Callback = (NSEvent) ->() 

class KeyCaptureWindow: NSWindow { 

    var keyEventListeners = Array<Callback>() 

    override func keyDown(event: NSEvent) { 
     if event.modifierFlags.contains(NSEventModifierFlags.CommandKeyMask) { 
      super.keyDown(event) 
      return 
     } 
     for callback in keyEventListeners { 
      callback(event) 
     } 
    } 

    func addKeyEventCallback(callback: Callback) { 
     keyEventListeners.append(callback) 
    } 


} 

a potem gdzie indziej w moim kodu mam linię tak:

let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate 
    let mainWindow = appDelegate.getWindow() 
    mainWindow.addKeyEventCallback(handleKeyEvent) 

dodałem metodę getWindow do mojej klasy app delegata. Ta metoda zwraca rzutowanie NSWindow na KeyCaptureWindow. Może być lepszy sposób na zrobienie tego wszystkiego, ale to działa dla mnie. Innym sposobem, aby to zrobić, jest skorzystanie z pierwszej odpowiedzi i NSView, ale to nie jest sposób, w jaki to robię.

+0

To jest naprawdę bardzo pomocne, dziękuję bardzo. – andertonslase

+0

Jeśli do komputera podłączonych jest wiele klawiatur, czy możliwe jest określenie, z której klawiatury pochodzi? – OrangePot

+1

Ostatnie wersje Swiftu zmodyfikowały tę funkcję. To teraz keyDown (z wydarzeniem: NSEvent). Dzięki za odpowiedź, bardzo pouczające! –

5

Musisz zastąpić metodę keyDown.

var direction:String = "" 

override func keyDown(theEvent: NSEvent!) // A key is pressed 
{ 
    if theEvent.keyCode == 123 
    { 
     direction = "left" //get the pressed key 
    } 
    else if theEvent.keyCode == 124 
    { 
     direction = "right" //get the pressed key 
    } 
    println("Key with number: \(theEvent.keyCode) was pressed") 
} 
Powiązane problemy