如何将菜单操作路由到窗口内的NSViewController?

zou*_*oul 7 macos cocoa nsmenuitem nsresponder

我在主应用程序菜单中有一个菜单项,我想将其动作路由到视图控制器(NSViewController).界面层次结构如下所示:有一个主应用程序窗口控制器NSWindowController.在窗口内部有一个分割视图,分割视图中的右视图由分割视图控制NSViewController.

Window + NSWindowController
    `-- NSSplitView
           `-- NSView
           `-- NSView + NSViewController
Run Code Online (Sandbox Code Playgroud)

菜单项连接到Interface Builder中的First Responder.有问题的视图控制器实现了适当的方法,但菜单项保持禁用状态.当我将方法移动到NSWindowController,菜单项被启用.

我想我需要将视图控制器放到响应器链中,所以我将其设置nextResponder为窗口控制器; 没有雪茄.我究竟做错了什么?

zou*_*oul 3

最后,我为窗口控制器添加了一个基类,并将其转发到 \xe2\x80\x9cchild\xe2\x80\x9d 控制器:

\n\n
- (id) childControllerForSelector: (SEL) selector\n{\n    for (id controller in [childControllers copy])\n        if ([controller respondsToSelector:selector])\n            return controller;\n    return nil;\n}\n\n- (BOOL) respondsToSelector: (SEL) selector\n{\n    return [super respondsToSelector:selector] ? YES :\n        [self childControllerForSelector:selector] ? YES :\n            NO;\n}\n\n- (void) forwardInvocation: (NSInvocation*) invocation\n{\n    id child = [self childControllerForSelector:[invocation selector]];\n    [invocation invokeWithTarget:child];\n}\n\n- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector\n{\n    NSMethodSignature *signature = [super methodSignatureForSelector:selector];\n    if (!signature) {\n        id child = [self childControllerForSelector:selector];\n        signature = [child methodSignatureForSelector:selector];\n    }\n    return signature;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它有很多代码,但它是一个通用的解决方案,可以使控制器代码免于临时转发。希望它\xe2\x80\x99s 没有太多魔力。

\n