我很难理解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)
}