我很难理解和查找有关如何使NSViewController接受键和鼠标事件的信息。我在某处读到,为了在NSViewController中注册这些事件,它应该被添加到响应者链中,但我找不到如何正确执行此操作的答案。
非常感谢任何形式的帮助!
答案 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
事件的问题。