我很难理解和查找有关如何使 NSViewController 接受键和鼠标事件的信息。我在某处读到,为了在 NSViewController 中注册这些事件,应该将其添加到响应者链中,但我找不到如何正确执行此操作的答案。
任何形式的帮助都非常感谢!
我很难理解和查找有关如何使 NSViewController 接受键和鼠标事件的信息。我在某处读到,为了在 NSViewController 中注册这些事件,应该将其添加到响应者链中,但我找不到如何正确执行此操作的答案。
任何形式的帮助都非常感谢!
在 CocoaWithLove.com上有一个很好的教程。
总结:您将创建一个 NSView 的子类(例如“EugeneView”),然后该子类将包含一些额外的方法,例如“ setNextResponder
”和“ setViewController
”。并且执行这两种方法应该将您的 NSViewController 集成到响应者链中。
NSViewController
从 OS X 10.10 Yosemite 开始,不再需要手动修补到响应者链中。根据WWDC '14的说法,“他们在看到之后立即自动连接到响应者链中。”
或者,如果在大多数情况下,您的控制器视图只是一个通用容器,请将您的控制器插入到其视图和子视图之间的响应者链中。这可以通过控制器中的这些代码行来完成awakeFromNib:
对象-C:
[self setNextResponder:self.view];
for (NSView *subview in self.view.subviews) {
[subview setNextResponder:self];
}
迅速:
override func awakeFromNib() {
super.awakeFromNib()
self.nextResponder = self.view
for subview in self.view.subviews {
subview.nextResponder = self
}
}
不需要子类化。
调试时。我注意到 NSViewControllerview
不接受第一响应者。
您可以通过打印来确认这一点print(viewController.view) //false
要将 NSViewController 添加到响应者链中,它的视图必须acceptFirstReponder
. 这可以通过创建 NSView 的扩展并覆盖其acceptFirstResponder
extension NSView{
//making view acceptFirstResponder by default,
//this will enable NSViewController receive responder event dispatched into responder chain
open override var acceptsFirstResponder: Bool{return true}
}
这样,您的控制器将添加到响应者链中,并将接收所有响应者事件。
我的解释可能不太准确,因为我是 Cocoa 的新手。但该解决方案确实运作良好。
我这样做是为了解决我的 ViewController 没有收到onKeyDown
事件的问题。