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

Eug*_*din 11 macos cocoa objective-c nsviewcontroller nsresponder

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

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

Mic*_*ann 7

在CocoaWithLove.com上找到了一个很好的教程.

总结:你将创建一个NSView的子类(例如"EugeneView"),然后该子类将有一些额外的方法,如" setNextResponder"和" setViewController".并且执行这两个方法应该将NSViewController集成到响应器链中.

  • 谢谢你的回应,迈克尔!我可以以某种方式将viewController添加到响应器链而无需从nsview进行子类化吗? (2认同)

Man*_*ban 7

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

  • @ClausJørgensen:你能根据一个特定的例子做出评论/下注吗?另外我想邀请你[看看上面的视频,20:33](https://developer.apple.com/videos/play/wwdc2014-212/). (5认同)

Guy*_*lon 5

或者,如果像大多数情况一样,控制器的视图只是一个通用容器,则将控制器插入其视图和子视图之间的响应链中.这可以通过控制器中的这些代码行来完成awakeFromNib:

OBJ-C:

[self setNextResponder:self.view];

for (NSView *subview in self.view.subviews) {
    [subview setNextResponder:self]; 
}
Run Code Online (Sandbox Code Playgroud)

迅速:

override func awakeFromNib() {
    super.awakeFromNib()
    self.nextResponder = self.view
    for subview in self.view.subviews {
        subview.nextResponder = self
    }
}
Run Code Online (Sandbox Code Playgroud)

不需要子类化.