КАКАО: значок NSStatusitem исчезает при запуске внешнего кода - PullRequest
0 голосов
/ 05 января 2011

Я - разработчик .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 запускается, когда изображение / кнопкапри щелчке изображение находится в трее в окне, которое открывается при нажатии на значок.На этом этапе монитор активности успешно запускается, но значок на панели состояния исчезает.

Я попытался вставить [super setNeedsDisplay: YES] в openActMon, но это не помогло.И я добавил [view setNeedsDisplay: YES] в openActMon, и он ответил необъявленным.

Я дал весь этот код, потому что, как я уже сказал, я не кодер Objective-C, но .Net, который простонужно портировать что-то маленькое.Надеюсь, что это будет полезно для других в будущем.Многое из этого я собрал вместе на разных форумах и сайтах или получил некоторую помощь от StackOverflow.Я надеюсь, что кто-то может помочь.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

В awakeFromNib добавить:

[statusitem retain];
0 голосов
/ 05 января 2011

В awakeFromNib вы выделяете NSImage в statusItem. Я думаю, что вы хотите выделить его в statusImage.

...