我是一个 .Net 开发人员,需要将一个小程序移植到 Mac OS X。我已经完成了大部分工作(部分感谢这个网站上的人,谢谢!)但是有一个错误,也许我可以得到帮助的人。
我正在创建一个位于状态栏中的工具,单击该工具会打开一个带有多个链接或按钮的窗口。单击链接或按钮时,它们会打开网站或外部程序。问题是当我启动这些外部命令之一时状态栏中的图标消失了。更有趣的是,状态栏上应该有图标的空间仍然响应;这意味着如果我单击该区域(即使没有可见图标),它仍然会运行代码并打开窗口。
这是当前代码:
托盘.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'");
}
托盘.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
我的视图.h
@interface MyView : NSControl {
NSImage *image;
id target;
SEL action;
}
@property (retain)NSImage *image;
@property (assign) id target;
@property (assign) SEL action;
@end
我的视图.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,图像位于单击图标时打开的托盘Win 窗口中。至此,活动监视器成功启动,但状态栏中的图标消失了。
我曾尝试在 openActMon 中放置一个 [super setNeedsDisplay:YES],但这并没有帮助。我在 openActMon 中添加了 [view setNeedsDisplay:YES] 并且它响应未声明。
我已经给出了所有这些代码,因为正如我所说,我不是 Objective-C 编码器,而是.Net,只需要移植一些小的东西。希望这对将来的其他人有所帮助。其中很多是我从不同的论坛和网站上拼凑起来的,或者从 StackOverflow 上的一些帮助中得到了帮助。我希望有人可以提供帮助。
提前致谢!