如何将NSViewController添加到响应链?

时间:2013-11-19 00:50:04

标签: objective-c macos cocoa nsviewcontroller nsresponder

我很难理解和查找有关如何使NSViewController接受键和鼠标事件的信息。我在某处读到,为了在NSViewController中注册这些事件,它应该被添加到响应者链中,但我找不到如何正确执行此操作的答案。

非常感谢任何形式的帮助!

4 个答案:

答案 0 :(得分:7)

从OS X 10.10 Yosemite开始,不再需要在NSViewController中手动修补响应者链。根据{{​​3}},"他们会在他们查看后立即自动连接到响应者链。"

答案 1 :(得分:6)

有一个很好的tutorial found at CocoaWithLove.com

总结:你将创建一个NSView的子类(例如“EugeneView”),然后该子类将包含一些额外的方法,例如“setNextResponder”和“setViewController”。执行这两个方法应该将NSViewController集成到响应程序链中。

答案 2 :(得分:5)

或者,如果像大多数情况一样,您的控制器视图只是一个通用容器,请将控制器插入其视图和子视图之间的响应器链中。这可以通过控制器的awakeFromNib:

中的这些代码行来完成

的OBJ-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
    }
}

不需要子类化。

答案 3 :(得分:0)

在调试时。我注意到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}
}

这样,您的控制器将被添加到响应者链,并将接收所有响应者事件。

由于我是可可新手,所以我的解释可能不太准确。但是该解决方案确实运行良好。

我这样做是为了解决ViewController没有收到onKeyDown事件的问题。