2011-12-15 2 views
1

내 프로젝트는 문서 기반이며 상태 코드를로드하는 코드는 awakeFromNib 아래에두면 실행됩니다. systemStatusBar를 시작하는 것이 applicationDidFinishLaunching에서 작동하지 않습니다.

#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

applicationDidFinishLaunching: 메시지는 응용 프로그램 개체에서 해당 대리인에게 전송됩니다. 다른 오브젝트에는 전송되지 않습니다.

문서 개체에서 해당 메시지에 확실히 응답 할 수 있지만 아무 것도 메시지 개체를 보내지 않아 메시지 개체를받지 못합니다. 따라서 문서 객체의 해당 메서드에서 수행하는 작업이나 응용 프로그램의 대리자가 아닌 다른 모든 객체가 수행되지 않습니다.

awakeFromNib은 상태 항목을 만들 수있는 곳입니다. 나는 아마 windowControllerDidLoadNib:에서 그것을 할 것이다.

실제로 문서 당 하나의 상태 항목을 갖고 싶다고 가정합니다. 이는 아마도 의미가 없습니다. 원하는 항목이 아닌 경우 상태 항목의 생성, 소유권 및 관리를 응용 프로그램의 대리자에 의해 applicationDidFinishLaunching: 내에 생성되어야하며 모든 문서가 다음과 같이 해당 객체와 상호 작용해야하는 단일 객체로 이동해야합니다. 필요합니다.

+0

감사합니다. 개체 (KBAppDelegate.h)를 만들고 응용 프로그램 대리자로 만들었으며 이제는 applicationDidFinishLaunching에서 작동합니다. (나는 상태 표시 줄이 열려있는 문서가 무엇이든 상관없이 머물러 있기를 바라고, 최대한 빨리로드하면 applicationDidFinishLaunching이 가장 좋습니다.) KBAppDelegate가 정규 클래스가 아닌 싱글 톤이 필요한 이유는 무엇입니까? – janeh

+0

@ janeh : 상태 항목을 만들고 소유 할 별도의 개체를 만들겠습니다. KBAppDelegate는 응용 프로그램의 대리인이어야하며 가능한 한 적게 사용해야합니다. 그것은'applicationDidFinishLaunching :'에 상태 항목 소유자 객체를 생성해야합니다; 그 객체는 순차적으로 상태 항목을 생성하고 소유해야하며, 다른 객체가 쉽게 접근하여 하나 이상의 객체가 존재하지 않도록 단일 객체가되어야합니다. –

+0

확인. 내 KBAppDelegate.h에는 상태 표시 줄 이미지를 릴리스하는 dealloc 코드도 있습니다. 상태 생성을 다른 객체로 옮기고 applicationDidFinishLaunching에서 메소드를 호출하면, 내 dealloc은 내가 풀어려고하는 이미지를 알지 못합니다. 맞습니까? 그래서 KBStatusMenu.m에 cleanUpMethod를 만들고 KBAppDelegate.m에서 호출해야합니다. 내 질문에 dealloc 모든 개체 또는 응용 프로그램 대리자를 호출 할 수 있습니다 것 같아요? (NSLog로 테스트 해 보았지만 작동하지 않을 것 같습니다.) – janeh