在基于文档的项目中,我正在尝试创建状态菜单。我有一个构建状态栏的单例类,我正在从应用程序委托中启动它,如您所见。当我运行它时,我没有错误,但只有状态栏的图像,但没有菜单下降。我在IB中创建了菜单。我搞砸了什么?
#import "KBAppDelegate.h"
#import "KBStatusMenu.h"
@implementation KBAppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
KBStatusMenu *aStatusItem = [[KBStatusMenu alloc] init];
aStatusItem = [[KBStatusMenu instance] buildStatusItem];
}
@end
#import <Foundation/Foundation.h>
@interface KBStatusMenu : NSObject
{
NSStatusItem *myStatusItem;
NSImage *statusImage;
IBOutlet NSMenu *myStatusMenu;
}
+ (KBStatusMenu *)instance;
- (id)buildStatusItem;
@end
#import "KBStatusMenu.h"
@implementation KBStatusMenu
static KBStatusMenu *gInstance = nil;
+ (KBStatusMenu *)instance
{
@synchronized(self) {
if (gInstance == nil)
gInstance = [[self alloc] init];
}
return(gInstance);
}
- (id)buildStatusItem
{
myStatusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
statusImage = [NSImage imageNamed:@"statusNormTemplate.png"];
[myStatusItem setImage:statusImage];
[myStatusItem setHighlightMode:YES];
[myStatusItem setMenu:myStatusMenu];
return myStatusItem;
}
@end
答案 0 :(得分:0)
您将myStatusMenu
声明为插座,但从未加载笔尖(或自行分配任何内容)。一个出口不能让物体冒出来;只有当您装入一个连接到某个插座的笔尖时才设置插座(或者自己为变量分配一些内容,就好像它不是插座一样)。
您可以通过向buildStatusItem
添加一行记录myStatusMenu
实例变量的值来证明这一点。我希望它会nil
。
您需要做的是:
KBStatusMenu
。init
以加载刚刚创建的笔尖。然后,当您到达buildStatusItem
时,加载笔尖将设置插座,您将有一个菜单来提供您的状态项。
我建议只创建一个KBStatusMenu
实例。在这种情况下,我建议强制执行单例:init
应测试是否已设置gInstance
,如果已设置,则返回该值;只有它不应该初始化并返回self
。