2014-12-06 147 views
3

我想为我的应用程序添加硬件键盘支持,以便用户随时可以通过按下键盘上的某个键来触发某个功能。我发现了this article,并且能够在Objective-C中发挥出色。我已将它转换为Swift,但出于某种原因,在按“c”后,keyPressed方法未被调用。我确认keyCommands只要用户按下键盘上的任何键就会被调用。我正在测试iOS模拟器和Mac键盘。在Swift中监听硬件键盘按键

这是什么问题在我的Swift代码中?

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 

func keyCommands() -> [AnyObject]? { 
    var keyCommands = [] 

    struct Static { 
     static var onceToken : dispatch_once_t = 0 
    } 
    dispatch_once(&Static.onceToken) { 
     let command = UIKeyCommand(input: "c", modifierFlags: nil, action: "keyPressed:") 
     keyCommands = [command] 
    } 

    return keyCommands 
} 

func keyPressed(command: UIKeyCommand) { 
    println("user pressed c") //never gets called 
} 

回答

2

问题是keyCommands被称为每次按键时我每次初始化数组,以便它是空的时候,然后我回去。所以第一次调用这个方法时,它会返回正确的数组,但是第二次它会返回一个没有内容的数组。

为了解决这个问题,我决定将key命令数组作为一个属性存储,然后在方法中检查它是否为nil,如果是的话我创建它,否则我只返回存储的属性。