Инициирование systemStatusBar не работает в приложении DidFinishLaunching - PullRequest
1 голос
/ 16 декабря 2011

Мой проект основан на документе, и код для загрузки меню состояния выполняется, только если я помещаю его в awakeFromNib.

#import "StatusMenuAppDelegate.h"

@implementation StatusMenuAppDelegate

@synthesize window = _window;

-(void)awakeFromNib {
    myStatusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
statusImage = [NSImage imageNamed:@"statusNorm.png"];
[myStatusItem setImage:statusImage];
[myStatusItem setHighlightMode:YES];
[myStatusItem setMenu:myStatusMenu];
}
@end

Но в моем тестовом проекте (не основанном на документах) код прекрасно выполняется в applicationDidFinishLaunching . Зачем? Разве я не хотел бы идеально использовать эту функцию для моего меню состояния?

1 Ответ

1 голос
/ 16 декабря 2011

Сообщение applicationDidFinishLaunching: отправляется объектом приложения его делегату. Не отправляется никаким другим объектам.

Вы, безусловно, можете ответить на это сообщение в объектах вашего документа, но они никогда не получат его, потому что ничто не отправляет его им. Вот почему все, что вы делаете в этом методе в объекте документа или в любом другом объекте, который не является делегатом приложения, не происходит.

awakeFromNib - это одно место, где вы можете создать статусный элемент. Я бы, наверное, сделал это в windowControllerDidLoadNib:.

Это предполагает, что вы действительно хотите иметь один элемент статуса на документ, что, вероятно, не имеет смысла. Если это не то, что вам нужно, вы должны перенести создание, владение и управление вашим элементом статуса в одноэлементный объект, который должен быть создан - вероятно, в applicationDidFinishLaunching: - делегатом приложения, и чтобы все документы взаимодействовали с этим объект по мере необходимости.

...