如何关联几个NSMenuItems的状态,以便它们是互斥的?

时间:2014-06-01 19:36:07

标签: objective-c cocoa nsmenuitem

在许多应用程序的 View→Sort by 菜单中看到的几种NSMenuItem状态的最佳关联方式是什么,这样它们是互斥的?这里以Mail的截图为例:

enter image description here

我在文档中找到了以下段落,但我不确定如何实现这个:

  

您可以使用状态来实现一组互斥菜单   物品,很像一组单选按钮。例如,游戏可以   有三个菜单项来显示游戏的级别:初学者,   中级和高级。要实现这样的组,请创建一个   他们都使用的动作消息。此操作消息更改   适当的设置,然后通过取消选中来反映该更改   当前已检查项目并检查新选择的项目。

1 个答案:

答案 0 :(得分:3)

区分发件人的常用方法是在IB中为每个标记分配一个唯一标记。然后使用[sender tag]在操作方法中获取该标记。

要查找正在切换的状态的旧已检查项目,可以使用[[sender menu] itemWithTag:tagForOldState]。但是,如果在多个菜单(例如主菜单和上下文菜单)中反映相同状态的任何可能性,则应考虑在实现操作方法的同一类中实现-validateMenuItem:。在该方法中,您可以检查项目-action-tag,以决定是否应根据当前的计划状态进行检查。然后,调用-setState:以应用适当的状态。

例如:

- (BOOL) validateMenuItem:(NSMenuItem*)menuItem
{
    if ([menuItem action] == @selector(sortBy:))
        [menuItem setState:([menuItem tag] == currentSortOrderTag) ? NSOnState : NSOffState];
    return YES;
}