我有一个基于文档的应用程序,NSSplitViewController作为主窗口的内容视图控制器。 左窗格包含一个带控制器的自定义视图,它实现了一些菜单命令。
右侧窗格包含带控制器的标准NSTableView。 当应用程序启动时,菜单命令按预期工作,但只要选择了右表视图中的任何内容,菜单命令就会被禁用。
如何确保左窗格的视图控制器保留在第一个响应者链中?
我尝试将菜单命令直接连接到正确的视图控制器,但IB不允许连接到故事板中的另一个场景。我只能连接到同一场景中的对象。
此致
Remco Poelstra
答案 0 :(得分:4)
连接第一响应者。
您可以让所有子视图控制器通过在NSSplitViewController子类中实现 - [NSResponder supplementalTargetForAction:sender:]来响应操作:
- (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;
}
答案 1 :(得分:1)
在Swift 4中,您可以执行以下操作:
override func supplementalTarget(forAction action: Selector, sender: Any?) -> Any? {
for childViewController in childViewControllers {
if childViewController.responds(to: action) {
return childViewController
} else {
guard let supplementalTarget = childViewController.supplementalTarget(forAction: action, sender: sender) else {
continue
}
return supplementalTarget
}
}
return super.supplementalTarget(forAction: action, sender: sender)
}