![](/img/trans.png)
[英]Responder Chain but NOT delegate property passes value back to view controller from container
[英]How to make embedded view controller part of the responder chain?
我注意到其中一些解决方案可能已经奏效,但我改编了来自https://stackoverflow.com/a/30938725/6938357的更通用的答案。
我在NSViewController
上做了一个扩展来寻找补充目标。 适用于NSSplitViewController
以及任何带有 child(ren) 的通用NSViewController
。
extension NSViewController {
open override func supplementalTarget(forAction action: Selector, sender: Any?) -> Any? {
if let target = super.supplementalTarget(forAction: action, sender: sender) {
return target
}
for child in children {
var target = NSApp.target(forAction: action, to: child, from: sender) as? NSResponder
if target?.responds(to: action) == false {
target = child.supplementalTarget(forAction: action, sender: sender) as? NSResponder
}
if target?.responds(to: action) == true {
return target
}
}
return nil
}
}
如果您只想在单个视图控制器上搜索它,请将这个实现放在那里。 此扩展适用于所有NSViewController
及其子类。
退房nextReponsder
财产NSResponder
。 此属性定义响应者链。 它通常会自动设置为遵循 Cocoa 框架定义的响应者更改,但您可以更改它以在不同方向插入/跳过/转移链。
例如,在某些时候(不要问我什么时候),Cocoa 开始在响应者链中包含窗口的控制器。 为了让我的应用程序在所有版本的 macOS 上一致运行,我将在我的窗口控制器中包含这样的代码:
- (void)windowDidLoad
{
// Sent when the controller's window has been loaded from the nib
[super windowDidLoad];
NSWindow* window = self.window;
// Make sure this window controller is in the responder chain
NSResponder* nextResponder = window.nextResponder; // get our window's next responder
if (nextResponder!=self)
{
// running earlier OS X that does not include the window controller in the chain: patch us in
self.nextResponder = nextResponder;
window.nextResponder = self;
}
-windowDidLoad
、 -viewDidLoad
和-awakeFromNib
都是调整响应链的好地方,以便它们包括或排除您想要的任何对象。
我最终通过将我的视图控制器添加到窗口委托来使其工作(在 Swift 4 中)。 之后,我的视图控制器成为响应者链的一部分(这使得应用程序菜单项在我的视图控制器中工作)。
//Step 1: Add NSWindowDelegate to the controller
class MyViewController: NSViewController, NSWindowDelegate{
override func viewDidLoad() {
super.viewDidLoad()
//Step 2: Add the view controller to the window delegate
if let window = NSApp.windows.first{
window.delegate = self
}
}
}
我希望能帮助别人。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.