使用动作和状态变量连接多个NSMenuItems

时间:2012-03-19 02:12:40

标签: objective-c cocoa binding action nsmenuitem

我不确定如何描述我需要的内容,但我会尝试一下,通过一个例子:

假设我们有一个窗口和一个侧边栏,想要切换它(我的意思是边栏:开/关)。

现在,我们也说:

  • 用户可以通过主菜单中的项目切换侧栏(例如,显示侧栏/隐藏侧栏)
  • 用户还可以通过按钮切换侧边栏
  • 在其他一些菜单中还有另一个项目可以做同样的事情(显示/隐藏边栏)

实现这一目标的最实用的Cocoa友好方法是什么?

当然,这意味着,例如:

  • 当有人点击按钮时,除了侧边栏(显示或隐藏)之外,菜单项现在必须显示侧边栏的当前状态(例如,“显示侧边栏”现在必须在所有可能的实例中转到“隐藏边栏”菜单内等)

我希望你能得到这个想法;这绝对不是什么难事;但我肯定对如何使用Cocoa的所有技巧来快速做到这一点感到困惑。

谢谢!

1 个答案:

答案 0 :(得分:3)

我假设您有一些实现动作-toggleSidebar:的控制器对象,并且两个菜单都以同一个控制器为目标。此外,在控制器中,您保留一个实例变量BOOL isSidebarShown

让您的控制器实现NSUserInterfaceValidations协议。像这样:

- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem
{
    if (anItem.action == @selector(toggleSidebar:) && [anItem isKindOfClass:[NSMenuItem class]])
    {
        NSString* title = isSidebarShown ? @"Hide Sidebar" : @"Show Sidebar";
        [(NSMenuItem*)anItem setTitle:title];
    }

    return YES;  // either way, the menu item is enabled
}