В моем приложении есть панель инспектора, определенная файлом .xib и классом настраиваемого оконного контроллера: AdjustmentsWindow.xib
и AdjustmentsWindowController.m
.
Я хочу иметь Window -> Show Adjustments
пункт меню в строке главного меню приложения, который при выборе будет отображать окно настроек. Я поместил экземпляр NSObject в xib, содержащий главное меню, и изменил его класс на «AdjustmentsWindowController». Я также подключил action
пункта меню к методу -showWindow:
контроллера. Пока все хорошо: экземпляр контроллера окна создается при запуске приложения, и когда вы выбираете пункт меню, он показывает свое окно.
Но я хочу, чтобы тот же пункт меню удваивался как «Скрыть настройки», когда окно уже видно (эффективно переключая видимость). Итак, вот что я сделал:
AdjustmentsWindowController.m:
- (void) windowDidLoad
{
[super windowDidLoad];
[[self window] setDelegate:self];
}
- (void) showWindow:(id)sender
{
// (Sent by 'original' menu item or 'restored' menu item)
[super showWindow:sender];
// Modify menu item:
NSMenuItem* item = (NSMenuItem*) sender;
[item setTitle:@"Hide Adjustments"];
[item setAction:@selector(hideWindow:)];
}
- (void) hideWindow:(id) sender
{
// (Sent by 'modified' menu item)
NSMenuItem* item = (NSMenuItem*) sender;
// Modify back to original state:
[item setTitle:@"Show Adjustments"];
[item setAction:@selector(showWindow:)];
[self close];
}
- (void) windowWillClose:(NSNotification *)notification
{
// (Sent when user manually closes window)
NSMenu* menu = [[NSApplication sharedApplication] mainMenu];
// Find menu item and restore to its original state
NSMenuItem* windowItem = [menu itemWithTitle:@"Window"];
if ([windowItem hasSubmenu]) {
NSMenu* submenu = [windowItem submenu];
NSMenuItem* item = [submenu itemWithTitle:@"Hide Adjustments"];
[item setTitle:@"Show Adjustments"];
[item setAction:@selector(showWindow:)];
}
}
Мой вопрос: это правильный / самый умный / самый элегантный способ добиться этого? Я имею в виду, что это довольно стандартное поведение в приложениях какао (см. Numbers 'Inspector'), как это делают все остальные?
Один из способов улучшить это - избежать дублирования кода при восстановлении исходного заголовка / действия пункта меню. Кроме того, в идеале я бы заменил строки заголовка обращениями к NSLocalizedString()
. Но, возможно, есть более элегантный стандартный подход, которого я не знаю ...