한 가지 제품의 두 가지 버전 (예 : light 및 pro 버전)을 배포하고 있습니다. NewApplication 개체를 동적으로 변경할 수없는 경우 동일한 MainMenu.xib를 사용하는 방법을 모르겠습니다. "NewApplication"대신 번들 이름을 사용하고 싶습니다. 해킹없이이를 수행 할 수있는 공식 방법이 있기를 바랍니다. 동적으로 NewApplication을 제거 하시겠습니까?
는
1
A
답변
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"];
변경할 메뉴 항목에 태그를 설정할 수도 있습니다.
1
당신은 가능성이 가장 높은 다중 목표 경로를 사용하려면, 감사; 일반 빌드 용 및 라이트 버전 용 빌드 타겟이있는 단일 Xcode 프로젝트를 사용하십시오. here을 참조하십시오. (그리고 네,이 공식적으로 엑스 코드에서 지원됩니다, 나는 앱 스토어에 자신의 응용 프로그램의 두 버전을 게시하는이 전략을 사용하는 여러 응용 프로그램 개발자로 알고있다.)
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 버전 문제가 있습니까? 또는 일부 헤더 파일이 부족합니까?
관련 문제
- 1. 동적으로 제거/제거 (제거 취소) C#
- 2. listitem - 제거 - 동적으로
- 3. JPanel에서 구성 요소를 동적으로 제거
- 4. document.write를 제거 하시겠습니까?
- 5. 텍스트에서 태그를 제거 하시겠습니까?
- 6. 단순히 커브를 제거 하시겠습니까?
- 7. View에서 subView를 제거 하시겠습니까?
- 8. TabHost - 그림자를 제거 하시겠습니까?
- 9. ListBox에서 항목을 제거 하시겠습니까?
- 10. JScrollBar, keyListener를 제거 하시겠습니까?
- 11. 시스템 서비스를 제거 하시겠습니까?
- 12. NSMutableData에서 바이트를 제거 하시겠습니까?
- 13. 배열에서 값을 제거 하시겠습니까?
- 14. 코드가있는 DataSourceID를 제거 하시겠습니까?
- 15. TabControl에서 거터를 제거 하시겠습니까?
- 16. IOS, 경고를 제거 하시겠습니까?
- 17. 제거 하시겠습니까? htaccess로
- 18. jQuery ::: 정말로 제거 하시겠습니까?
- 19. PHP를 교체하고 제거 하시겠습니까?
- 20. ArrayList에서 객체를 제거 하시겠습니까?
- 21. 동적으로 버튼을 추가 하시겠습니까?
- 22. ReCaptcha를 동적으로 테스트 하시겠습니까?
- 23. addEventListener를 동적으로 사용 하시겠습니까?
- 24. 테이블을 동적으로 생성 하시겠습니까?
- 25. HTML 콘텐츠의 공백을 제거 하시겠습니까?
- 26. 문자열에서 숫자를 제거 하시겠습니까? 문자열에서
- 27. Qt - 메뉴를 아래에서 제거 하시겠습니까?
- 28. Vim에서 중복 줄을 제거 하시겠습니까?
- 29. 목록 목록에서 중복을 제거 하시겠습니까?
- 30. 결말 요소의 공간을 제거 하시겠습니까?
[menuBar itemAtIndex : 0]의 메뉴 항목이 $ (PRODUCT_NAME)로 자동 대체됩니다. 따라서 다시 대체 할 필요가 없습니다. stringByReplacingOccurrencesOfString : withString : – cocoafan
을 사용하지 않고 "Quit NewApplication"과 같은 하위 메뉴 항목을 자동화하는 방법을 찾고 싶습니다. 내 대답도 참조하십시오. – cocoafan
BTW, [menuBar itemAtIndex : 0]; NSMenu를 반환하지 않습니다. NSMenuItem을 반환합니다. – cocoafan