1

我的项目是基于文档的,加载状态菜单的代码只有在我将它放在 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中执行得很好。为什么?我不想理想地将此功能用于我的状态菜单吗?

4

1 回答 1

1

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

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

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

这是假设您真的希望每个文档都有一个状态项,这可能没有意义。如果这不是您想要的,您应该将状态项的创建、所有权和管理移至一个单例对象,该对象应该applicationDidFinishLaunching:由应用程序的委托创建(可能在其中),并根据需要让任何和所有文档与该对象交互.

于 2011-12-16T01:25:33.290 回答