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为窗口控制器; 没有雪茄.我究竟做错了什么?
最后,我为窗口控制器添加了一个基类,并将其转发到 \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}\nRun Code Online (Sandbox Code Playgroud)\n\n它有很多代码,但它是一个通用的解决方案,可以使控制器代码免于临时转发。希望它\xe2\x80\x99s 没有太多魔力。
\n