繁体   English   中英

如何将 NSViewController 添加到响应者链?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM