2009-09-24 1 views
1

Я распространяю две разные версии одного продукта (например, light and pro version). Я не знаю, как использовать тот же MainMenu.xib, если я не могу изменить шаблон NewApplication динамическим способом. Я хотел бы использовать имя пакета вместо «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). Поэтому нет необходимости его заменять. Я надеялся найти способ автоматизировать также элементы подменю, такие как «Выйти из NewApplication», не используя stringByReplacingOccurrencesOfString: withString: :) – cocoafan

+0

См. Также мой собственный ответ – cocoafan

+0

BTW, [menuBar itemAtIndex: 0]; не вернет NSMenu. Он вернет NSMenuItem. – cocoafan

1

Вы, скорее всего хотите использовать маршрут несколько целевых задач; используйте один проект Xcode с несколькими целями построения, один для вашего обычного приложения и один для вашей облегченной версии. См. here. (И да, это официально поддерживается в Xcode, и я знаю нескольких разработчиков приложений, которые используют эту стратегию, чтобы опубликовать обе версии своего приложения на App Store.)

+0

Тим, у меня уже есть две цели, использующие «тот же» MainMenu.xib. Это не решит проблему в строке меню. Оба продукта (создаваемые целевыми объектами) будут отображать те же пункты меню, что и строка «NewApplication». И здесь я хочу поместить переменную $ (PRODUCT_NAME) из целей. – cocoafan

+0

Можете ли вы использовать кучу операторов '# ifdef' и' # define' для указания отдельной переменной, например 'MENU_DISPLAY_NAME', и использовать ее как свой идентификатор меню? – Tim

3

Вдохновленный от ответа 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]; 
} 
1

Xcode 2.4.1

для (NSMenuItem * MENUITEM в [Menubar itemArray]) ошибки: вложенные функции отключены, используйте -fnested-функцию для повторного включения ошибки: синтаксическая ошибка, прежде чем " в '

root.title = [root.title stringByReplacingOccurrencesOfString: @ "NewApplication" withString: appName]; Ошибка: запросить название участника 'в чем-то не структурном или объединении

Xcode version issue? или отсутствие некоторых файлов заголовков?

Смежные вопросы