将两个NSSplitViewController的子控制器都保留在第一响应者链中 [英] Keep both NSSplitViewController's child controllers in first responder chain

查看:184
本文介绍了将两个NSSplitViewController的子控制器都保留在第一响应者链中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基于文档的应用程序,带有一个NSSplitViewController作为主窗口的内容视图控制器. 左窗格包含带有控制器的自定义视图,该视图实现了一些菜单命令.

I've a document based app with an NSSplitViewController as the main window's content view controller. The left pane contains a custom view with controller, which implements some menu commands.

右窗格包含带有控制器的标准NSTableView. 应用启动后,菜单命令会按预期工作,但是一旦选择了右表视图中的任何内容,菜单命令就会被禁用.

The right pane contains a standard NSTableView with controller. When the app starts the menu commands work as expected, but as soon as anything inside the right table view is selected, the menu commands get disabled.

如何确保左窗格的视图控制器保留在第一个响应者链中?

How can I make sure that the view controller of the left pane remains inside the first responder chain?

我尝试将菜单命令直接连接到正确的视图控制器,但是IB不允许连接到情节提要中的另一个场景.我只能连接到同一场景中的对象.

I tried hooking up the menu commands directly to the correct view controller, but IB does not allow connections to another scene in a storyboard. I can only connect to objects in the same scene.

此致

Remco Poelstra

Remco Poelstra

推荐答案

连接到第一响应者".

您可以通过在NSSplitViewController子类中实现-[NSResponderSupplementalTargetForAction:sender:]来使所有子视图控制器对动作做出响应:

You can have all child view controllers respond to actions by implementing -[NSResponder supplementalTargetForAction:sender:] in your NSSplitViewController subclass:

- (id)supplementalTargetForAction:(SEL)action sender:(id)sender
{
    id target = [super supplementalTargetForAction:action sender:sender];

    if (target != nil) {
        return target;
    }

    for (NSViewController *childViewController in self.childViewControllers) {
        target = [NSApp targetForAction:action to:childViewController from:sender];

        if (![target respondsToSelector:action]) {
            target = [target supplementalTargetForAction:action sender:sender];
        }

        if ([target respondsToSelector:action]) {
            return target;
        }
    }

    return nil;
}

这篇关于将两个NSSplitViewController的子控制器都保留在第一响应者链中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆