2015-01-26 3 views
7

Я пытаюсь найти способ определить, нажата ли клавиша (на клавиатуре) на Swift. Любые идеи и предложения будут высоко оценены.Обнаружение события нажатия клавиши в Swift

+1

Что вы пытаетесь? –

+2

Это не дубликат. Ответы Objective-C не являются дубликатами для вопросов Swift. –

+0

В каком контексте вы хотели обнаружить нажатие клавиши? В окне? Вход? –

ответ

10

Поскольку вы обновили свой вопрос и хотите узнать, как это сделать для окна, вот вам ответ. Подкласс NSWindow и вместо этого используйте этот подкласс.

Ваш пользовательский класс должен выглядеть следующим образом:

import Cocoa 

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

Если вы сделали окно в Interface Builder/XCode, щелкните объект окна и перейти к Attribute Inspector ( + +). Инспектор атрибутов будет находиться на боковой панели справа. Убедившись, что ваше окно выбрано в Interface Builder, в верхней части Attribute Inspector в области Custom Class введите ваш новый класс в ввод класса.

Attribute Selector

Для того, чтобы связывать события из класса этого окна в моем приложение я добавить функцию к окну, которое принимает функцию обратного вызова, который я затем хранить в массиве функций обратного вызова. Я получаю доступ к этому окну через AppDelegate, который может получить слабую ссылку на текущее главное окно. Затем в приведенной выше функции я повторяю все обратные вызовы и вызываю их с помощью NSEvent в качестве аргумента. Я также сначала проверяю, нажаты ли сначала какие-либо командные клавиши, такие как клавиши выбора, через свойство modifierFlags на мероприятии. Он заканчивает тем, как это:

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) 
    } 


} 

А потом в другом месте в моем коде у меня есть строка так:

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

я добавил метод getWindow в моем класс приложения делегата. Этот метод возвращает NSWindow, отлитый от KeyCaptureWindow. Там может быть лучший способ сделать все это, но это работает для меня. Другой способ сделать это - использовать первых респондентов и NSView, но это не то, как я это делал.

+0

Это действительно очень полезно, спасибо вам большое. – andertonslase

+0

Если с компьютером подключено несколько клавиатур, можно ли идентифицировать клавиатуру, из которой только что пришли? – OrangePot

+1

Последние версии Swift изменили функцию. Теперь это keyDown (с событием: NSEvent). Спасибо за ответ, очень информативно! –

5

Вам необходимо переопределить 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") 
} 
Смежные вопросы