【问题标题】:Creating status item - icon shows up, menu doesn't创建状态项 - 图标显示,菜单不显示
【发布时间】:2011-12-19 04:34:52
【问题描述】:

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

【问题讨论】:

  • 你为什么要用allocinit创建你自己的实例,然后用共享的instance替换它?
  • 您确定myStatusMenu 确实存在吗? (即非零?)

标签: cocoa statusbar nsstatusitem nsapplication


【解决方案1】:

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

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

你需要做的是:

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

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

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

【讨论】:

  • 是的,'myStatusMenu' 为零! (返回修复。)
  • "1. 创建一个包含状态项菜单的笔尖" - 我在 MainMenu.xib 中创建了状态菜单
  • @janeh:这无济于事,因为 KBStatusMenu 无法知道这一点。它不在 MainMenu nib 中,也不拥有 MainMenu nib。应用程序拥有 MainMenu nib,我不认为在 MainMenu nib 中创建 KBStatusMenu 是正确的,因此我的建议是:为 KBStatusMenu 创建一个新的 nib。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多