keyDown不能快速工作

时间:2015-04-16 19:10:17

标签: macos cocoa swift event-handling keydown

那是我的代码:

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

正如你所看到的,我试图识别是否按下了一个箭头按钮,但它永远不会起作用。甚至似乎也没有调用函数keyDown。

这是viewDidAppear中的内容,如果这可以帮助您提供答案:

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

viewDidLoad我只是添加了一些不可选择且不可编辑的NSTextField:

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
    }

我只是不知道keyDown为什么不起作用,所以我真的很感激任何帮助。

修改

全班代码:

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

}

4 个答案:

答案 0 :(得分:2)

试试此代码

  ResourceBundle resource = ResourceBundle.getBundle("test");
  String VALUE1=resource.getString("KEY1");
  String VALUE2=resource.getString("KEY2");

答案 1 :(得分:1)

你的应用甚至可以构建吗?

NSEvent个实例没有character属性,他们拥有characters属性。使用character会导致构建失败并且Xcode出现错误消息。更多characters返回可选Stringswitch个案例属于Int类型 - 此类型不匹配也会导致构建失败。

根据我的经验,找出是否按下任何箭头键的最简单方法是打开事件的keyCode属性。

import Foundation
import Cocoa

let kLeftArrowKeyCode:  UInt16  = 123
let kRightArrowKeyCode: UInt16  = 124
let kDownArrowKeyCode:  UInt16  = 125
let kUpArrowKeyCode:    UInt16  = 126


class ViewController: NSViewController {

    override func keyDown(theEvent: NSEvent) {

        switch theEvent.keyCode {

        case kLeftArrowKeyCode:
            println(1)
        case kRightArrowKeyCode:
            println(2)
        case kDownArrowKeyCode:
            println(3)
        case kUpArrowKeyCode:
            println(4)
        default:
            break
        }
    }   
}

如果您愿意,您仍然可以使用预定义的常量,但这些代表Unicode代码,因此在您开启characters之前,您需要先将它们转换为字符串。

答案 2 :(得分:1)

您只需使用隐形按钮即可。首先在窗口中添加一个方形按钮。为其分配所需的密钥。使您的按钮宽0像素,高0像素。将IBAction添加到按钮,并在用户按下键时执行代码。

另一个选项是addLocalMonitorForEventsMatchingMask以获取更多信息,请查看此链接

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

答案 3 :(得分:1)

忽略有关转换字符等的额外内容,如果您的keyDown()功能即使被调用,最可能的原因是您没有告诉操作系统您的视图可以接受关键事件(通过覆盖acceptsFirstResponder)。

在视图类中执行此操作:

override var acceptsFirstResponder: Bool { get { return true } }