0

在一个基于文档的项目中,我正在尝试创建一个状态菜单。如您所见,我有一个构建状态栏的单例类,并且我从应用程序委托启动它。当我运行它时,我没有收到任何错误,但只有状态栏的图像,但没有下拉菜单。我在 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

。H

#import <Foundation/Foundation.h>

@interface KBStatusMenu : NSObject 
{
    NSStatusItem *myStatusItem;
    NSImage *statusImage;
    IBOutlet NSMenu *myStatusMenu;
}

+ (KBStatusMenu *)instance;
- (id)buildStatusItem;

@end

.m

#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
4

1 回答 1

0

您声明myStatusMenu为插座,但从未加载笔尖(或自己分配任何东西)。出口无法从任何地方取出物体;仅当您加载将插座连接到某物的笔尖时才设置插座(或自己为变量分配某物,就好像它不是插座一样)。

您可以通过添加一行buildStatusItem记录myStatusMenu实例变量的值来证明这一点。我希望它会是nil

你需要做的是:

  1. 创建一个 nib 以包含状态项的菜单。
  2. 将文件所有者的类设置为KBStatusMenu.
  3. 在 KBStatusMenu 中,实现init加载刚刚创建的 nib。

然后,当您到达buildStatusItem时,加载 nib 将设置出口,并且您将有一个菜单可以提供给您的状态项。

我建议只创建一个KBStatusMenu实例。在这种情况下,我建议强制执行单例:init应该测试是否gInstance已经设置,如果是,则返回;仅当它不应该初始化并返回时self

于 2011-12-19T05:56:47.767 回答