Nikitin Roman Nikitin Roman - 5 days ago 5
Swift Question

keyDown doesn't work swift

That's my code:

override func keyDown(theEvent: NSEvent) {
super.keyDown(theEvent)
switch theEvent.character {
case NSLeftArrowFunctionKey:
println(1)
case NSRightArrowFunctionKey:
println(2)
case NSDownArrowFunctionKey:
println(3)
case NSUpArrowFunctionKey:
println(4)
default:
break
}
}


As you can see, I try to recognize if one of arrow buttons was pressed, but it never works. Even the function keyDown never seems to be called.

That's what is written in
viewDidAppear
, if this can help you to provide the answer:

override func viewDidAppear() {
super.viewDidAppear()
self.view.window?.styleMask = NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask
var frame = self.view.window?.frame
var newHeight = CGFloat(438)
var newWidth = CGFloat(415)
frame?.size = NSMakeSize(newWidth, newHeight)
self.view.window?.setFrame(frame!, display: true)
self.view.window?.backgroundColor = NSColor.darkGrayColor()
}


In
viewDidLoad
I just add some non-selectable and non-editable NSTextFields like that:

var x = CGFloat(0)
var y = CGFloat(0)
var tag = 1

for var i = 0; i < 4; i++ {
for var j = 0; j < 4; j++ {
var tile = NSTextField(frame: NSRect(x: x, y: y, width: 100, height: 100))
tile.enabled = false
tile.stringValue = ""
tile.font = NSFont(name: "Helvetica", size: 75)
tile.backgroundColor = NSColor.lightGrayColor()
tile.editable = false
tile.selectable = false
tile.drawsBackground = true
tile.alignment = NSTextAlignment(rawValue: 2)!
tile.tag = tag
x += 105
ar.append(tile)
self.view.addSubview(tile)
tag++
}
x = 0
y += 105
}


I just have no idea why
keyDown
doesn't work, so I'll really appreciate any help.

EDIT:

The whole class code:

import Cocoa
import AppKit
import Foundation

class _048Main: NSViewController {

var ar : Array<NSTextField> = []
var left = 0

var dict : Dictionary<Int, NSColor> = [:]

var pic2 = NSColor.redColor()
var pic4 = NSColor.whiteColor()
var pic8 = NSColor.orangeColor()
var pic16 = NSColor.magentaColor()
var pic32 = NSColor()
var pic64 = NSColor()
var pic128 = NSColor()
var pic256 = NSColor() // Some colors will be added
var pic512 = NSColor()
var pic1024 = NSColor()
var pic2048 = NSColor()


override func viewDidLoad() {
super.viewDidLoad()

dict[2] = pic2
dict[4] = pic4
dict[8] = pic8
dict[16] = pic16
dict[32] = pic32
dict[64] = pic64
dict[128] = pic128
dict[256] = pic256
dict[512] = pic512
dict[1024] = pic1024
dict[2048] = pic2048

var x = CGFloat(0)
var y = CGFloat(0)
var tag = 1

for var i = 0; i < 4; i++ {
for var j = 0; j < 4; j++ {
var tile = NSTextField(frame: NSRect(x: x, y: y, width: 100, height: 100))
tile.enabled = false
tile.stringValue = ""
tile.font = NSFont(name: "Helvetica", size: 75)
tile.backgroundColor = NSColor.lightGrayColor()
tile.editable = false
tile.selectable = false
tile.drawsBackground = true
tile.alignment = NSTextAlignment(rawValue: 2)!
tile.tag = tag
x += 105
ar.append(tile)
self.view.addSubview(tile)
tag++
}
x = 0
y += 105
}
left = 16
generateTile()
generateTile()
}

func generateTile() {
var r = Int(arc4random_uniform(UInt32(left)))
var tmp = 0
for var i = 0; i < 16; i++ {
if ar[i].stringValue == "" {
if tmp == r {
var t = Int(arc4random_uniform(10))
switch t {
case 0...1:
ar[i].stringValue = "2"
ar[i].backgroundColor = pic2
default:
ar[i].stringValue = "4"
ar[i].backgroundColor = pic4
}
left--
break
}
tmp++
}
}
}

override func viewDidAppear() {
super.viewDidAppear()
self.view.window?.styleMask = NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask
var frame = self.view.window?.frame
var newHeight = CGFloat(438)
var newWidth = CGFloat(415)
frame?.size = NSMakeSize(newWidth, newHeight)
self.view.window?.setFrame(frame!, display: true)
self.view.window?.backgroundColor = NSColor.darkGrayColor()
}


override func keyDown(theEvent: NSEvent) {
super.keyDown(theEvent)
switch theEvent.character {
case NSLeftArrowFunctionKey:
println(1)
case NSRightArrowFunctionKey:
println(2)
case NSDownArrowFunctionKey:
println(3)
case NSUpArrowFunctionKey:
println(4)
default:
super.mouseDown(theEvent)
}
}

}

Answer

You just need to use an invisible button. First add a square button to your window. assign the desired key for it. make your button 0 pixels wide and 0 pixels height. Add an IBAction to your button and the code to be executed when the user press the key.

Another option is to addLocalMonitorForEventsMatchingMask for more info check this link

http://stackoverflow.com/a/32447474/2303865

Comments