我是一名.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上得到了一些帮助。我希望有人可以提供帮助。
提前致谢!
答案 0 :(得分:2)
在awakeFromNib
添加:
[statusitem retain];
答案 1 :(得分:0)
在awakeFromNib中,您将NSImage分配到statusItem。我认为你的意思是将它分配给statusImage。