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