启动systemStatusBar在applicationDidFinishLaunching中不起作用

时间:2011-12-15 22:50:41

标签: cocoa statusbar nsapplication

我的项目是基于文档的,加载状态菜单的代码只有在我把它放在awakeFromNib下才能执行。

#import "StatusMenuAppDelegate.h"

@implementation StatusMenuAppDelegate

@synthesize window = _window;

-(void)awakeFromNib {
    myStatusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
statusImage = [NSImage imageNamed:@"statusNorm.png"];
[myStatusItem setImage:statusImage];
[myStatusItem setHighlightMode:YES];
[myStatusItem setMenu:myStatusMenu];
}
@end

但是,在我的测试项目(非基于文档的)中,代码在 applicationDidFinishLaunching 中执行得很好。为什么?我不想在状态菜单中理想地使用此功能吗?

1 个答案:

答案 0 :(得分:1)

应用程序对象将applicationDidFinishLaunching:消息发送给其委托。它不会发送到任何其他对象。

您当然可以在文档对象中回复该消息,但它们永远不会收到它,因为没有任何内容将它发送给它们。这就是为什么你在文档对象中的那个方法中做的任何事情,或者不是应用程序委托的任何其他对象,都不会发生。

awakeFromNib是您可以创建状态项的地方。我可能会在windowControllerDidLoadNib:中完成。

假设您确实希望每个文档都有一个状态项,这可能没有意义。如果这不是您想要的,您应该将状态项的创建,所有权和管理移动到单个对象,该对象应该由应用程序的委托创建 - 可能在applicationDidFinishLaunching:内 - 并且让任何和所有文档交互根据需要使用该对象。