我的项目基于文档,并且仅当我将其置于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中执行得很好。为什么?我是否不希望在状态菜单中使用此功能?
最佳答案
applicationDidFinishLaunching:
消息由应用程序对象发送到其委托。它不会发送到任何其他对象。
您当然可以在文档对象中响应该消息,但是它们将永远不会收到该消息,因为没有内容发送给他们。这就是为什么您不会在文档对象或不是应用程序委托的任何其他对象中使用该方法执行任何操作的原因。awakeFromNib
是您可以创建状态项的地方。我可能会在windowControllerDidLoadNib:
中这样做。
这是假设您确实希望每个文档有一个状态项,这可能没有意义。如果这不是您想要的,则应将状态项的创建,所有权和管理移至单个对象,该对象应由应用程序的委托创建(可能在applicationDidFinishLaunching:
之内),并使所有文档与之交互根据需要对象。
关于cocoa - 初始化systemStatusBar在applicationDidFinishLaunching中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8527737/