2015-01-26 28 views
7

Tôi đang cố gắng tìm cách phát hiện xem một phím (trên bàn phím) đã được nhấn vào Swift chưa. Bất kỳ ý tưởng và đề xuất sẽ được đánh giá rất nhiều.Phát hiện sự kiện báo chí quan trọng trong Swift

+1

Bạn đã thử gì? –

+2

Đây không phải là bản sao. Câu trả lời của Objective-C không trùng lặp với các câu hỏi Swift. –

+0

Trong bối cảnh nào bạn muốn phát hiện một phím bấm? Trên cửa sổ? Một đầu vào? –

Trả lời

10

Vì bạn đã cập nhật câu hỏi và muốn biết cách thực hiện điều này cho cửa sổ, đây là câu trả lời. Subclass NSWindow và sử dụng phân lớp này thay thế.

lớp tùy chỉnh của bạn sẽ trông như thế này:

import Cocoa 

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

Nếu bạn đã thực hiện cửa sổ của bạn trong giao diện Builder/XCode, nhấp vào đối tượng cửa sổ và đi đến thuộc tính Inspector ( + +). Thanh tra thuộc tính sẽ nằm trong thanh bên ở bên phải. Đảm bảo cửa sổ của bạn được chọn trong Trình tạo giao diện, ở đầu Trình kiểm tra thuộc tính trong khu vực Custom Class đặt lớp mới của bạn vào đầu vào lớp.

Attribute Selector

Để giao tiếp sự kiện từ lớp cửa sổ này để ứng dụng của tôi tôi thêm một chức năng để cửa sổ mà chấp nhận một hàm callback mà tôi sau đó lưu trữ trong một mảng các chức năng gọi lại. Tôi nhận được quyền truy cập vào cửa sổ này thông qua AppDelegate mà có thể nhận được một tham chiếu yếu đến cửa sổ chính hiện tại. Sau đó, trong hàm trên, tôi lặp lại tổng thể các callbacks và gọi nó với NSEvent làm đối số. Trước tiên tôi cũng kiểm tra xem có bất kỳ phím lệnh nào như các phím tùy chọn đang được nhấn đầu tiên thông qua thuộc tính modifierFlags trong sự kiện hay không. Nó kết thúc lên tim như thế này:

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


} 

Và sau đó ở những nơi khác trong mã của tôi, tôi có một dòng như vậy:

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

tôi đã thêm các phương pháp getWindow đến lớp ứng dụng đại biểu của tôi. Phương thức này trả về số NSWindow truyền tới KeyCaptureWindow. Có thể có một cách tốt hơn để làm tất cả điều này nhưng điều này làm việc cho tôi. Một cách khác để có thể làm điều này là sử dụng người trả lời đầu tiên và NSView, nhưng đó không phải là cách tôi đã làm điều đó.

+0

Điều này thực sự thực sự hữu ích, cảm ơn bạn rất nhiều. – andertonslase

+0

Nếu có nhiều bàn phím được kết nối với máy tính, có thể nhận dạng bàn phím nào đến từ bàn phím không? – OrangePot

+1

Các phiên bản gần đây của Swift đã sửa đổi chức năng. Nó bây giờ là keyDown (với sự kiện: NSEvent). Cảm ơn câu trả lời, rất thông tin! –

5

Bạn phải ghi đè phương thức 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") 
} 
Các vấn đề liên quan