Cocoa 启动系统状态栏不';t在应用程序中工作IDfinishLaunching
我的项目是基于文档的,加载状态菜单的代码只有放在awakeFromNib下才能执行Cocoa 启动系统状态栏不';t在应用程序中工作IDfinishLaunching,cocoa,statusbar,nsapplication,Cocoa,Statusbar,Nsapplication,我的项目是基于文档的,加载状态菜单的代码只有放在awakeFromNib下才能执行 #import "StatusMenuAppDelegate.h" @implementation StatusMenuAppDelegate @synthesize window = _window; -(void)awakeFromNib { myStatusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareS
#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
但是,在我的测试项目(非基于文档)中,代码在ApplicationIDFinishLaunching中执行良好。为什么?我不想理想地将此功能用于我的状态菜单吗 应用程序对象向其委托发送
ApplicationIDFinishLaunching:
消息。它不会发送到任何其他对象
您当然可以在文档对象中响应该消息,但它们永远不会收到该消息,因为没有任何东西向它们发送该消息。这就是为什么您在该方法中对文档对象或任何其他非应用程序委托的对象所做的任何事情都不会发生
awakeFromNib
是一个可以创建状态项的地方。我可能会在窗口控制器idloadnib:
中这样做
假设您真的希望每个文档有一个状态项,这可能没有意义。如果这不是您想要的,您应该将状态项的创建、所有权和管理移动到singleton对象,该对象可能应该由应用程序的委托在
ApplicationIDFinishLaunching:
中创建,并让任何和所有文档根据需要与该对象交互。应用程序对象将ApplicationIDFinishLaunching:
消息发送给其委托人。它不会发送到任何其他对象
您当然可以在文档对象中响应该消息,但它们永远不会收到该消息,因为没有任何东西向它们发送该消息。这就是为什么您在该方法中对文档对象或任何其他非应用程序委托的对象所做的任何事情都不会发生
awakeFromNib
是一个可以创建状态项的地方。我可能会在窗口控制器idloadnib:
中这样做
假设您真的希望每个文档有一个状态项,这可能没有意义。如果这不是您想要的,您应该将状态项的创建、所有权和管理移动到singleton对象,该对象可能应该由应用程序的代理在
ApplicationIDFinishLaunching:
-内创建,并根据需要让任何和所有文档与该对象交互。谢谢。我创建了一个对象(KBAppDelegate.h)并使其成为应用程序委托,现在它可以与ApplicationIDFinishLaunching一起工作。(我希望无论打开什么文档,状态栏都保持不变,并尽快加载,这就是为什么我认为ApplicationIDFinishLaunching最适合这样做的原因)。为什么我需要我的KBAppDelegate是一个单例类,而不是一个普通类?@janeh:我会创建一个单独的对象来创建和拥有状态项。KBAppDelegate应该是应用程序的委托,并且尽可能少地使用其他委托。它应该在ApplicationIDFinishLaunching:
中创建状态项所有者对象;然后,该对象应该创建并拥有状态项,并且是一个单独的对象,以便其他对象可以轻松地访问该状态项,并防止其中存在多个状态项。Ok。在我的KBAppDelegate.h中,我还有dealloc代码,它们释放状态栏图像。如果我将状态创建移动到另一个对象,从ApplicationIDFinishLaunching调用该方法,我的dealloc将不知道我正在尝试发布哪些图像,对吗?因此,我必须在KBStatusMenu.m中创建一些cleanUpMethod,并从KBAppDelegate.m调用它。我想我的问题是dealloc可以从任何对象调用,还是只从应用程序委托调用?(我试着用NSLog测试它,但我想那是行不通的。)@janeh:创建状态项的对象也应该为状态项创建/加载图像。因此,它将不得不释放其dealoc
中的那些<代码>解除锁定作为对象最后一次释放的结果被调用;永远不要直接打电话。当你的应用程序代理释放它以前创建的状态项所有者对象时,应该调用它。谢谢!我现在头疼:我还有一个问题,只有状态菜单的图标显示出来。我又开始了另一个话题-/谢谢我创建了一个对象(KBAppDelegate.h)并使其成为应用程序委托,现在它可以与ApplicationIDFinishLaunching一起工作。(我希望无论打开什么文档,状态栏都保持不变,并尽快加载,这就是为什么我认为ApplicationIDFinishLaunching最适合这样做的原因)。为什么我需要我的KBAppDelegate是一个单例类,而不是一个普通类?@janeh:我会创建一个单独的对象来创建和拥有状态项。KBAppDelegate应该是应用程序的委托,并且尽可能少地使用其他委托。它应该在ApplicationIDFinishLaunching:
中创建状态项所有者对象;然后,该对象应该创建并拥有状态项,并且是一个单独的对象,以便其他对象可以轻松地访问该状态项,并防止其中存在多个状态项。Ok。在我的KBAppDelegate.h中,我还有dealloc代码,它们释放状态栏图像。如果我将状态创建移动到另一个对象,从ApplicationIDFinishLaunching调用该方法,我的dealloc将不知道我正在尝试发布哪些图像,对吗?因此,我必须在KBStatusMenu.m中创建一些cleanUpMethod,并从KBAppDelegate.m调用它。我想我的问题是dealloc可以从任何对象调用,还是只从应用程序委托调用?(我试着用NSLog测试它,但我想那是行不通的。)@janeh:创建状态项的对象也应该为状态项创建/加载图像。因此,它将不得不释放其dealoc
中的那些<代码>解除锁定作为对象最后一次释放的结果被调用;永远不要直接打电话。当你的应用程序代理释放它以前创建的状态项所有者对象时,应该调用它。谢谢!我的头现在疼了:我还有另一个问题