2009-09-24 6 views
1

한 가지 제품의 두 가지 버전 (예 : light 및 pro 버전)을 배포하고 있습니다. NewApplication 개체를 동적으로 변경할 수없는 경우 동일한 MainMenu.xib를 사용하는 방법을 모르겠습니다. "NewApplication"대신 번들 이름을 사용하고 싶습니다. 해킹없이이를 수행 할 수있는 공식 방법이 있기를 바랍니다. 동적으로 NewApplication을 제거 하시겠습니까?

답변

4

내가 이런 식으로 할 거라고 :

NSMenu *menuBar = [NSApp mainMenu]; 
// we know that the application is always at the very left 
NSMenu *applicationMenu = [menuBar itemAtIndex:0]; 
// we know that the quit-menu item is always the last element 
NSMenuItem *quitMenuItem = [applicationMenu itemAtIndex: 
            [applicationMenu numberOfItems] - 1]; 

quitMenuItem.title = [quitMenuItem.title 
        stringByReplacingOccurrencesOfString:@"NewApplication" 
               withString:@"SomeOtherName"]; 

변경할 메뉴 항목에 태그를 설정할 수도 있습니다.

+0

[menuBar itemAtIndex : 0]의 메뉴 항목이 $ (PRODUCT_NAME)로 자동 대체됩니다. 따라서 다시 대체 할 필요가 없습니다. stringByReplacingOccurrencesOfString : withString : – cocoafan

+0

을 사용하지 않고 "Quit NewApplication"과 같은 하위 메뉴 항목을 자동화하는 방법을 찾고 싶습니다. 내 대답도 참조하십시오. – cocoafan

+0

BTW, [menuBar itemAtIndex : 0]; NSMenu를 반환하지 않습니다. NSMenuItem을 반환합니다. – cocoafan

1

당신은 가능성이 가장 높은 다중 목표 경로를 사용하려면, 감사; 일반 빌드 용 및 라이트 버전 용 빌드 타겟이있는 단일 Xcode 프로젝트를 사용하십시오. here을 참조하십시오. (그리고 네,이 공식적으로 엑스 코드에서 지원됩니다, 나는 앱 스토어에 자신의 응용 프로그램의 두 버전을 게시하는이 전략을 사용하는 여러 응용 프로그램 개발자로 알고있다.)

+0

Tim, 이미 '동일한'MainMenu.xib를 사용하는 두 개의 대상이 있습니다. 이렇게해도 메뉴 모음의 문제는 해결되지 않습니다. 두 제품 (대상에서 생성)은 "NewApplication"문자열을 포함하는 동일한 메뉴 항목을 표시합니다. 그리고 여기가 목표 변수 $ (PRODUCT_NAME)을 배치하기위한 것입니다. – cocoafan

+0

'# ifdef'와'# define' 문을 사용하여 'MENU_DISPLAY_NAME'과 같은 별도의 변수를 지정할 수 있으며 이것을 메뉴 식별자로 사용할 수 있습니까? – Tim

3

gs의 대답에서 영감을 얻은 다음 여기에 내 코드에 추가 된 내용이 나와 있습니다. AppDelegate의 awakeFromNib에서 setupBundleNameInMenuBar을 호출합니다.

이 코드는 모두 발생을 응용 프로그램 이름과 함께 "NewApplication"으로 바꿉니다.

- (void)setupBundleNameInMenuBar { 
    NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleNameKey]; 
    if (appName == nil) appName = [[NSProcessInfo processInfo] processName]; 

    NSMenu *menuBar = [NSApp mainMenu]; 
    for (NSMenuItem *menuItem in [menuBar itemArray]) 
     [self replaceTitlePlaceholderInMenuItem: menuItem withString: appName]; 
} 

- (void)replaceTitlePlaceholderInMenuItem:(NSMenuItem *)root withString:(NSString *)appName { 
    root.title = [root.title stringByReplacingOccurrencesOfString: @"NewApplication" 
                 withString: appName]; 

    NSArray *submenuItems = [root.submenu itemArray]; 
    for (NSMenuItem *menuItem in submenuItems) 
     [self replaceTitlePlaceholderInMenuItem: menuItem withString: appName]; 
} 
1

엑스 코드 2.4.1 오류 ([의 도구 모음 itemArray]에 NSMenuItem *는 menuItem) 용

: 중첩 기능이 비활성화 에러를 재 활성화 -fnested-기능을 사용 구문 오류 전에 ' in '

root.title = [root.title stringByReplacingOccurrencesOfString : @ "NewApplication" withString : appName]; 오류 : 구조 또는 조합이 아닌 무언가에 'title'회원을 요청하십시오.

Xcode 버전 문제가 있습니까? 또는 일부 헤더 파일이 부족합니까?

관련 문제