Вдохновленный от ответа gs, вот что я добавил в свой код. Я звоню setupBundleNameInMenuBar
в AppDelegate's awakeFromNib
.
Этот код заменяет все появление «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];
}
Элемент меню в пункте [menuBar itemAtIndex: 0] автоматически заменяется на $ (PRODUCT_NAME). Поэтому нет необходимости его заменять. Я надеялся найти способ автоматизировать также элементы подменю, такие как «Выйти из NewApplication», не используя stringByReplacingOccurrencesOfString: withString: :) – cocoafan
См. Также мой собственный ответ – cocoafan
BTW, [menuBar itemAtIndex: 0]; не вернет NSMenu. Он вернет NSMenuItem. – cocoafan