NSStatusItem появляется на короткое время при запуске, но быстро исчезает
Я начинаю возвращаться к разработке Какао после того, как ничего не работаю в течение нескольких месяцев. Первоначально, когда я начинал, я использовал 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 ответа
_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 точно скажет вам, если это было то, что происходило. Но в целом ваше приложение должно иметь четкую ссылку на этот объект, чтобы оно оставалось на месте.
У меня была эта проблема в 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.