gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:07:41 27 4
gpt4 key购买 nike

我的主应用菜单中有一个菜单项,我想将其操作路由到 View Controller (NSViewController)。界面层次结构如下所示:有一个由 NSWindowController 组成的主应用程序窗口 Controller 。窗口内部有一个分割 View ,分割 View 中的右侧 View 由 NSViewController 控制。

Window + NSWindowController
`-- NSSplitView
`-- NSView
`-- NSView + NSViewController

菜单项已连接到 Interface Builder 中的 First Responder。有问题的 View Controller 实现了适当的方法,但菜单项保持禁用状态。当我将该方法移至 NSWindowController 时,菜单项将被启用。

我认为我需要将 View Controller 添加到响应者链中,因此我将其设置为窗口 Controller 的 nextResponder ;没有雪茄。我做错了什么?

最佳答案

最后,我为窗口 Controller 添加了一个基类,并将其转发给“子” Controller :

- (id) childControllerForSelector: (SEL) selector
{
for (id controller in [childControllers copy])
if ([controller respondsToSelector:selector])
return controller;
return nil;
}

- (BOOL) respondsToSelector: (SEL) selector
{
return [super respondsToSelector:selector] ? YES :
[self childControllerForSelector:selector] ? YES :
NO;
}

- (void) forwardInvocation: (NSInvocation*) invocation
{
id child = [self childControllerForSelector:[invocation selector]];
[invocation invokeWithTarget:child];
}

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector
{
NSMethodSignature *signature = [super methodSignatureForSelector:selector];
if (!signature) {
id child = [self childControllerForSelector:selector];
signature = [child methodSignatureForSelector:selector];
}
return signature;
}

代码很多,但它是一个通用的解决方案,可以使 Controller 代码免于临时转发。希望这不是太神奇。

关于macos - 如何将菜单操作路由到窗口内的 NSViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11452983/

27 4 0