我有一个包含窗口的笔尖(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,因为它们位于不同的笔尖中!
答案 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];