【问题标题】:Checking keyDown event.modifierFlags yields error检查 keyDown event.modifierFlags 产生错误
【发布时间】:2016-01-14 12:00:24
【问题描述】:

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

Apple's documentation 表示您只需使用 NSEventModifierFlags.CommandKeyMask 来修饰符标志(在传递的 NSEvent 中)。

当我这样做时:

let ck = NSEventModifierFlags.CommandKeyMask

我收到一个奇怪的错误:

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

有什么关系?这是 swift 2.0,xcode 7。

谢谢!

【问题讨论】:

    标签: macos swift cocoa


    【解决方案1】:

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

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

    【讨论】:

    • 投反对票的不是我。无论如何,你为什么从 theEvent.modifierFlags.contains 更改为 theEvent.modifierFlags.rawValue== ?
    • 只是为了确保按下了一个修饰键
    • 所以如果我以后想检查多个修饰键,contains 方法会更合适?
    • 只有代码的答案,没有解释答案应该如何回答问题,这是不受欢迎的。更新答案以说明问题所在以及如何解决问题。
    • 这与您之前发布的答案有什么关系?
    【解决方案2】:

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

    【讨论】:

    • @LeoDabus 更新了答案。
    【解决方案3】:

    我打算发表评论,但无法发表。

    万一以后有人(比如我)看到这篇文章,Swift 自 2015 年以来发生了一些变化。

    斯威夫特 4:

    Event.modifierFlags.contains(.command)

    Event.modifierFlags.contains(.option)

    theEvent.modifierFlags.contains([.command, .option]) NSLog("command and option keys down")

    还有; (.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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      相关资源
      最近更新 更多