我正在发布一个产品的两个不同版本(如light和pro版本)。如果我无法以动态方式更改占位符NewApplication,我不知道如何使用相同的MainMenu.xib。我想使用包名称而不是“NewApplication”。 我希望有一个官方的方式来做到这一点,而不是黑客攻击。以动态的方式摆脱NewApplication?
谢谢,
我正在发布一个产品的两个不同版本(如light和pro版本)。如果我无法以动态方式更改占位符NewApplication,我不知道如何使用相同的MainMenu.xib。我想使用包名称而不是“NewApplication”。 我希望有一个官方的方式来做到这一点,而不是黑客攻击。以动态的方式摆脱NewApplication?
谢谢,
我会做这样的:
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"];
您还可以在要更改的菜单项上设置标签。
你很可能想使用多目标路线;使用一个包含多个构建目标的Xcode项目,一个用于常规应用程序,另一个用于您的Lite版本。请参阅here。 (是的,这是正式在Xcode的支持,我知道是谁用这个策略来发布他们的应用程序商店应用程序的两个版本的几个应用程序开发人员。)
从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];
}
的Xcode 2.4.1
为(NSMenuItem *菜单项在[菜单栏itemArray]) 错误:嵌套功能被禁止,则使用-fnested函数以重新启用 错误:语法错误之前' '
root.title = [root.title stringByReplacingOccurrencesOfString:@“NewApplication” withString:appName]; 错误:请求成员'标题'的东西不是结构或工会
Xcode版本问题?或者缺少一些头文件?
[menuBar itemAtIndex:0]中的菜单项自动被$(PRODUCT_NAME)替换。所以没有必要再次替换它。我希望找到一种方法来自动化子菜单项目,如“Quit NewApplication”,而不使用stringByReplacingOccurrencesOfString:withString::) – cocoafan 2009-09-24 22:00:36
请参阅我自己的回答 – cocoafan 2009-09-25 09:44:19
顺便说一句,[menuBar itemAtIndex:0];将不会返回一个NSMenu。它将返回一个NSMenuItem。 – cocoafan 2009-09-27 17:55:46