检查keyDown event.modifierFlags会产生错误

时间:2015-10-15 21:04:06

标签: macos swift cocoa

我继承了NSTextView并重写了keyDown。我想检测命令键组合。例如,Command-L。

Apple's documentation表示你只是修饰符标志(在传递的NSEvent中)和NSEventModifierFlags.CommandKeyMask。

当我这样做时:

let ck = NSEventModifierFlags.CommandKeyMask

我收到一个奇怪的错误:

Binary operator '&' cannot be applied to two 'NSEventModifierFlags' operands.

这笔交易是什么?这是swift 2.0,xcode 7。

谢谢!

3 个答案:

答案 0 :(得分:11)

  

Apple的文档表明您只需修饰符标记

文档仍然指C和Objective-C。 Swift使用OptionSetType,它不使用按位运算符来检查标志。

相反,使用contains()方法检查一个或多个标志:

    if theEvent.modifierFlags.contains(.CommandKeyMask) {
        NSLog("command key down")
    }

    if theEvent.modifierFlags.contains(.AlternateKeyMask) {
        NSLog("option key down")
    }

    if theEvent.modifierFlags.contains([.CommandKeyMask, .AlternateKeyMask]) {
        NSLog("command and option keys down")
    }

要检查单个密钥,请使用intersect过滤掉任何不需要的标记,然后使用==检查单个标记:

    let modifierkeys = theEvent.modifierFlags.intersect(.DeviceIndependentModifierFlagsMask)

    if modifierkeys == .CommandKeyMask {
        NSLog("Only command key down")
    }

答案 1 :(得分:2)

NSEventModifierFlags是Swift 2.0中的optionSet。您可以使用contains方法检查它是否包含命令修饰键

override func keyDown(theEvent:NSEvent) {
    if theEvent.characters == "l" && theEvent.modifierFlags.contains(.CommandKeyMask) {
        print("command-L pressed")
    }
}

答案 2 :(得分:1)

我本来要发表评论,但没能。

万一有人(像我一样)将来遇到这篇文章,自2015年以来Swift发生了一些变化。

快捷键4:

theEvent.modifierFlags.contains(.command)

theEvent.modifierFlags.contains(.option)

theEvent.modifierFlags.contains([。command,.option])         NSLog(“按下命令和选项键”)

也; (.control)用于CTRL。

这是我的特殊代码:

override func viewDidLoad()
{
    super.viewDidLoad()

    NSEvent.addLocalMonitorForEvents(matching: NSEvent.EventTypeMask.keyDown, handler: myKeyDownEvent)

}


func myKeyDownEvent(event: NSEvent) -> NSEvent {

    if (event.keyCode == 121) && event.modifierFlags.contains([.command, .option]) {

        //Do what you want when PGDN + cmd + alt is pressed

    }

    return event
}