0

私は .Net 開発者で、小さなプログラムを Mac OS X に移植する必要があります。これはほぼ完了しています (一部はこのサイトの人々のおかげです、ありがとう!)。

ステータスバーにあるツールを作成しています。クリックすると、いくつかのリンクまたはボタンを含むウィンドウが開きます。リンクまたはボタンをクリックすると、Web サイトまたは外部プログラムが開きます。問題は、これらの外部コマンドの 1 つを起動すると、ステータス バーのアイコンが消えることです。さらに興味深いのは、アイコンが表示されるステータス バーのスペースがまだ応答していることです。つまり、領域をクリックすると (アイコンが表示されていなくても)、コードが実行されてウィンドウが開きます。

現在のコードは次のとおりです。

トレイ.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

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ウィンドウに配置されます。この時点で、Activity Monitor は正常に起動しますが、StatusBar のアイコンが消えます。

[super setNeedsDisplay:YES] を openActMon に入れてみましたが、役に立ちませんでした。そして、openActMon に [view setNeedsDisplay:YES] を追加すると、未宣言で応答しました。

前述したように、私は Objective-C のコーダーではなく、何か小さなものを移植する必要がある .Net であるため、このコードをすべて提供しました。これが将来他の人に役立つことを願っています。これの多くは、さまざまなフォーラムやサイトから寄せ集めたり、StackOverflow のヘルプから得たりしたものです。誰かが助けてくれることを願っています。

前もって感謝します!

4

2 に答える 2

2

加えawakeFromNibて:

[statusitem retain];
于 2011-10-06T23:23:34.217 に答える
0

awakeFromNib では、NSImage を statusItem に割り当てています。statusImageに割り当てるつもりだと思います。

于 2011-01-04T22:28:49.860 に答える