从MainMenu获取特定菜单项

时间:2010-05-19 21:06:07

标签: objective-c cocoa xcode nsmenuitem

我有一个包含窗口的笔尖(winA.xib)。我的app委托包含一个名为WinAController的NSWindowController子类。

WinAController有一个属性(NSMenu * mainMenu),我想指向MainMenu。我使用以下代码实例化WinAController之后设置了它:

    WinAController = [[WinAController alloc] initWithWindowNibName:@"WinA"];
    WinAController.mainMenu = [NSApp mainMenu];

我在MainMenu上的“Window”顶级菜单项下面有一个菜单项,它调用[WinAController showWindow]方法并显示WinA。我想根据WinA是否可见来切换此菜单项的开/关状态。 WinAController还有另一个属性(NSMenuItem * myMenuItem)。

如何获得对“Window”顶级菜单项的子菜单的引用。我想要获得的子菜单项的标题是“Command”。我试过这个:

    if (mainMenu != nil) {
    myMenuItem = [mainMenu itemAtIndex:[mainMenu indexOfItemWithTitle:@"Command"]];
}

但它似乎不起作用。

我哪里错了?

谢谢,

编辑:我现在已将WinAController放在mainMenu.xib中。我已经将WinA(在winA.xib中)文件的所有者设置为类WinAController,但我无法弄清楚如何将WinAController的窗口IBOutlet连接到WinA,因为它们位于不同的笔尖中!

2 个答案:

答案 0 :(得分:5)

您可以直接存储对菜单项的引用,可能通过主笔尖中的IBOutlet存储。

或者(更好的是,IMO),您可以在-validateMenuItem:中实现WinAController并在那里设置状态(这样,状态仅在用户实际看到它时设置):< / p>

- (BOOL)validateMenuItem:(NSMenuItem *)item {
    if ([item action] == @selector(showWindow:)]
        [item setState:[winA isVisible] ? NSOnState : NSOffState];

    return YES;
}

答案 1 :(得分:1)

我以为我告诉过你把Window Controllers放在MainMenu.xib中?

好吧,没有什么冒险,什么都没有。当然,您想要做的是:

@interface MyApplicationDelegate : NSObject {
  IBOutlet NSMenuItem *winAMenuItem;
}

@property(assign) IBOutlet NSMenuItem *winAMenuItem;

@end

然后您可以通过[[NSApp delegate] winAMenuItem];

访问此内容