簡體   English   中英

如何將 NSViewController 添加到響應者鏈?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM