[英]How to add NSViewController to a responder chain?
我很难理解和查找有关如何使 NSViewController 接受键和鼠标事件的信息。 我在某处读到为了在 NSViewController 中注册这些事件,应该将其添加到响应者链中,但我找不到如何正确执行此操作的答案。
任何形式的帮助都非常感谢!
在 CocoaWithLove.com 上找到了一个不错的教程。
总结:您将创建 NSView 的子类(例如“EugeneView”),然后该子类中将包含一些额外的方法,例如“ setNextResponder
”和“ setViewController
”。 并且执行这两个方法应该让您的 NSViewController 集成到响应者链中。
从 OS X 10.10 Yosemite 开始,不再需要在NSViewController
手动修补到响应者链中。 根据WWDC '14 的说法,“他们会在查看后立即自动连接到响应者链中。”
或者,在大多数情况下,如果您的控制器视图只是一个通用容器,请将您的控制器插入其视图与其子视图之间的响应者链中。 这可以通过控制器的awakeFromNib:
这些代码行来完成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
}
}
不需要子类化。
调试时。 我注意到 NSViewController view
不接受第一响应者。
您可以通过打印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
事件的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.