我的项目是基于文档的,加载状态菜单的代码只有在我把它放在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 中执行得很好。为什么?我不想在状态菜单中理想地使用此功能吗?
答案 0 :(得分:1)
应用程序对象将applicationDidFinishLaunching:
消息发送给其委托。它不会发送到任何其他对象。
您当然可以在文档对象中回复该消息,但它们永远不会收到它,因为没有任何内容将它发送给它们。这就是为什么你在文档对象中的那个方法中做的任何事情,或者不是应用程序委托的任何其他对象,都不会发生。
awakeFromNib
是您可以创建状态项的地方。我可能会在windowControllerDidLoadNib:
中完成。
假设您确实希望每个文档都有一个状态项,这可能没有意义。如果这不是您想要的,您应该将状态项的创建,所有权和管理移动到单个对象,该对象应该由应用程序的委托创建 - 可能在applicationDidFinishLaunching:
内 - 并且让任何和所有文档交互根据需要使用该对象。