NSStatusItem появляется на короткое время при запуске, но быстро исчезает - PullRequest
11 голосов
/ 16 января 2012

Я начинаю возвращаться к разработке Cocoa после того, как ничего не работал в течение нескольких месяцев. Первоначально, когда я начинал, я использовал Snow Leopard и Xcode 3. Сейчас я работаю с Lion с Xcode 4.2 и сталкиваюсь с некоторыми проблемами, с которыми раньше не сталкивался.

Полагаю, это тот факт, что я никогда раньше не использовал ARC, поэтому я уверен, что что-то упустил.

Я пытаюсь создать приложение Statusbar, без главного окна или значка док-станции. Когда я запускаю приложение, значок Statusbar моего приложения появляется на короткое время, примерно на секунду, но затем исчезает.

Вот мой код.

QuickPlusAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface QuickPlusAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (assign) NSStatusItem *statusItem;
@property (weak) IBOutlet NSMenu *statusItemMenu;

@property (strong) NSImage *statusItemIcon;
@property (strong) NSImage *statusItemIconHighlighted;
@property (strong) NSImage *statusItemIconNewNotification;

@end

QuickPlusAppDelegate.m

#import "QuickPlusAppDelegate.h"

@implementation QuickPlusAppDelegate
@synthesize statusItemMenu = _statusItemMenu;

@synthesize window = _window, statusItem = _statusItem;
@synthesize statusItemIcon = _statusItemIcon, 
    statusItemIconHighlighted = _statusItemIconHighlighted, 
    statusItemIconNewNotification = _statusItemIconNewNotification;

- (void) awakeFromNib
{
    NSBundle *appBundle = [NSBundle mainBundle];
    _statusItemIcon = [[NSImage alloc] initWithContentsOfFile:[appBundle pathForResource:@"statusItemIcon" ofType:@"png"]];
    _statusItemIconHighlighted = [[NSImage alloc] initWithContentsOfFile:[appBundle pathForResource:@"statusItemIconHighlighted" ofType:@"png"]];
    _statusItemIconNewNotification = [[NSImage alloc] initWithContentsOfFile:[appBundle pathForResource:@"statusItemIconNewNotification" ofType:@"png"]];

    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [_statusItem setImage:_statusItemIcon];
    [_statusItem setAlternateImage:_statusItemIconHighlighted];
    [_statusItem setHighlightMode:YES];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // empty
}

@end

Редактировать Если вы видите что-то не так с моим кодом, пожалуйста, дайте мне знать. Я определенно хотел бы немного критики, чтобы я мог поправиться.

Другое редактирование Кажется, что значок Statusbar исчезает при загрузке самого главного окна.

Ответы [ 2 ]

20 голосов
/ 16 января 2012

_statusItem будет автоматически освобожден в этом случае.

    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

Возвращает автоматически выпущенный объект._statusItem - это просто iVar.Мало того, вы объявляете свойство как assign:

@property (assign) NSStatusItem *statusItem;

Здесь вы, вероятно, захотите сделать это сделать свойство strong, а затем вместо прямой установки ivar использовать свойство для установкиЭто.Вот так:

@property (strong) NSStatusItem *statusItem;

, а затем:

self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

Это приведет к сохранению statusItem.Я держу пари, что сейчас происходит то, что оно освобождается, когда пул авто-релиза появляется, и затем ваше приложение аварийно завершает работу, когда в следующий раз что-либо пытается получить к нему доступ, что приводит к его исчезновению из строки меню.Запуск его через инструмент Zombies точно скажет вам, если это было то, что происходило.Но в целом ваше приложение должно иметь четкую ссылку на этот объект, чтобы оно оставалось без изменений.

1 голос
/ 02 марта 2015

У меня была эта проблема в Xamarin.Некоторое время все работало нормально.Затем я добавил дополнительный код в метод FinishedLaunching и StatusItem начал исчезать.У меня был этот код, генерирующий StatusItem:

    public override void AwakeFromNib ()
    {
        var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (30);
        statusItem.Menu = mainMenu;
        statusItem.Image = NSImage.ImageNamed ("menuicon");
        statusItem.AlternateImage = NSImage.ImageNamed ("menuicon_selected");
        statusItem.HighlightMode = true;
    }

В конце концов, я нашел свою проблему.В моем XCode я объявил это свойство в своем AppDelegate, но я не использовал его:

@property(nonatomic, retain) IBOutlet NSStatusItem *statusItem;

Когда я удалил var, StatusItem продолжал показывать в своей бесконечной славе:)

    public override void AwakeFromNib ()
    {
        statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (30);
        statusItem.Menu = mainMenu;
        statusItem.Image = NSImage.ImageNamed ("menuicon");
        statusItem.AlternateImage = NSImage.ImageNamed ("menuicon_selected");
        statusItem.HighlightMode = true;
    }

Мне не пришлось менять его на (сильный).На самом деле я пытался, но это не сохранялось при копировании обратно в Xamarin Studio.

...