COCOA:NSStatusitem图标在启动外部代码时消失

时间:2011-01-04 21:39:50

标签: cocoa view icons nsstatusitem

我是一名.Net开发人员,需要将一个小程序移植到Mac OS X.我主要完成此操作(部分归功于此站点上的人员,谢谢!)但是有一个错误,也许我可以得到帮助的人用。

我正在创建一个位于状态栏中的工具,单击该工具会打开一个包含多个链接或按钮的窗口。单击链接或按钮时,它们可以打开网站或外部程序。问题是,当我启动其中一个外部命令时,状态栏中的图标会消失。更有趣的是状态栏上的图标应该仍然响应的空间;这意味着如果我点击该区域(即使没有可见图标),它仍会运行代码并打开窗口。

以下是当前代码:

tray.m

#import "tray.h"
#import "MyView.h"

@implementation Tray
-(void) awakeFromNib{
    NSBundle *bundle = [NSBundle mainBundle];
    statusItem = [[NSImage alloc] initWithContentsofFile:[bundle pathForResource:"@icon" ofType:@"png"]];
    MyView *view = [MyView new];
    [statusItem setImage:statusImage];
    view.image = statusImage;
    [statusitem setView:view];
    [statusitem setToolTip:@"Tray App"];
    [view setTarget:self];
    [view setAction:@selector(openWindow)];
}

-(IBAction)openWindow:(id)sender{
    [trayWin makeKeyAndOrderFront:nil];
}

-(IBAction)openActMon:(id)sender {
    (void)system("open '\/Applications/Utilities/Activity Monitor.app'");
}

tray.h

#import "MyView.h"

@interface Tray : NSObject {
    NSStatusItem *statusItem;
    NSImage *statusImage;

    IBOutlet NSWindow * trayWin;
    IBOutlet NSButton *ActMon;

    void *openWindow;
}

@property (retain,nonatomic) NSStatusItem *statusItem;
-(IBAction)ActMon:(id)sender;
@end

MyView.h

@interface MyView : NSControl {
    NSImage *image;
    id target;
    SEL action;
}
@property (retain)NSImage *image;
@property (assign) id target;
@property (assign) SEL action;
@end

MyView.m

#import "MyView.h"
@implementation MyView;
@synthethize image, target, action;
-(void)mousemouseUP:(NSEvent *)event{
    [NSApp sendAction:selfself.action to:self.target from:self];
}
-(void)dealloc {
    self.image = nil;
    [super dealloc];
}
-(void)drawRect:(NSRect)rect {
    [self.image drawInRect:CGRectMake(0,0,18,18) fromRect:NSZeroRect operation:NSCompositeSourceOver];
}
@end
}

单击图像/按钮时运行openActMon,图像位于单击图标时打开的trayWin窗口中。此时,活动监视器成功启动,但StatusBar中的图标消失。

我尝试在openActMon中添加[super setNeedsDisplay:YES],但这没有帮助。我在openActMon中添加了[view setNeedsDisplay:YES],并且它未响应。

我已经提供了所有这些代码,因为正如我所说,我不是Objective-C编码器,而是.Net只需要移植一些小东西。希望这对将来的其他人有所帮助。很多这个我已经从不同的论坛和网站一起大肆宣传,或者从StackOverflow上得到了一些帮助。我希望有人可以提供帮助。

提前致谢!

2 个答案:

答案 0 :(得分:2)

awakeFromNib添加:

[statusitem retain];

答案 1 :(得分:0)

在awakeFromNib中,您将NSImage分配到statusItem。我认为你的意思是将它分配给statusImage。

相关问题