当窗口中存在多个 NSTextView 时,接收键入的密钥的不一定是接收命令密钥的那个。为什么?



我很难理解OS X中的响应程序链。

我有一个NSTextView子类,我希望它响应命令键并做一些事情。我创建了一个非常简单的问题演示。只要几分钟的努力,任何感兴趣的人都可以看到。

创建一个新的OSX项目,这里是您唯一需要的附加代码。在Swift中创建一个名为MyTextView的新类(NSTextView的子类),并将其粘贴到其中:

import Cocoa
class MyTextView: NSTextView {
    // listen for a command key
    override func performKeyEquivalent(theEvent: NSEvent) -> Bool {
        // if it's a cmd-equals, change the background
        if theEvent.characters == "=" && theEvent.modifierFlags.contains(.CommandKeyMask) {
            Swift.print(theEvent)
            self.backgroundColor = NSColor(calibratedRed: CGFloat(arc4random()) / CGFloat(UInt32.max),
                green: CGFloat(arc4random()) / CGFloat(UInt32.max),
                blue: CGFloat(arc4random()) / CGFloat(UInt32.max),
                alpha: 1.0)
            return true
        }
        return super.performKeyEquivalent(theEvent)
    }
}

现在,在情节提要中,将2个或多个NSTextView放入同一contentView中。在Identity Inspector下,告诉每个NSTextView它的类是MyTextView(NSTextView嵌套了一点:NSCrollView>NSClipView>NSTextView)。

运行项目。按cmd等于。其中一个文本视图会更改其背景颜色,但它不一定是拥有光标的视图,因为光标会接收所有其他按键。它不一定是以光标开头的。如果您将光标放在不同的textView中,它仍然不会改变哪一个响应命令键。

为什么?为什么接收键入键击的文本视图与接收命令键的文本视图不同?显然,文本视图知道谁应该接收击键,因为打字是有效的。但我的指挥钥匙给了别人。

这是解决方案。MyTextView需要测试它是否是FirstResponder。如果是,则消耗事件。如果不是,那就不是。

override func performKeyEquivalent(theEvent: NSEvent) -> Bool {
    if self.window?.firstResponder == self {
        // if it's a cmd-equals, change the background
        if theEvent.characters == "=" && theEvent.modifierFlags.contains(.CommandKeyMask) {
            Swift.print(theEvent)
            self.backgroundColor = NSColor(calibratedRed: CGFloat(arc4random()) / CGFloat(UInt32.max),
                green: CGFloat(arc4random()) / CGFloat(UInt32.max),
                blue: CGFloat(arc4random()) / CGFloat(UInt32.max),
                alpha: 1.0)
            return true
        }
    }
    return super.performKeyEquivalent(theEvent)
}

相关内容

  • 没有找到相关文章

最新更新