13

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

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

4

4 回答 4

9

在 CocoaWithLove.com上有一个很好的教程。

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

于 2013-11-19T01:05:16.197 回答
7

NSViewController从 OS X 10.10 Yosemite 开始,不再需要手动修补到响应者链中。根据WWDC '14的说法,“他们在看到之后立即自动连接到响应者链中。”

于 2016-02-22T16:08:52.997 回答
6

或者,如果在大多数情况下,您的控制器视图只是一个通用容器,请将您的控制器插入到其视图和子视图之间的响应者链中。这可以通过控制器中的这些代码行来完成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
    }
}

不需要子类化。

于 2014-03-12T06:54:54.870 回答
1

调试时。我注意到 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事件的问题。

于 2020-03-19T15:43:23.893 回答