Лучший способ переключить пункт меню Показать / Скрыть в Cocoa Desktop

В моем приложении есть панель инспектора, определенная файлом .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(). Но, возможно, есть более элегантный стандартный подход, которого я не знаю ...


person Nicolas Miari    schedule 10.11.2013    source источник
comment
›В приложении May есть ... Я думаю, он имеет в виду, что у моего приложения есть расширение. На первое предложение у меня ушло полминуты.   -  person El Tomato    schedule 10.11.2013


Ответы (1)


Темы программирования меню приложений и всплывающих списков сказал

validateMenuItem: также является хорошим местом для переключения заголовков или установки состояния пунктов меню, чтобы убедиться, что они всегда правильные.

person Lexandr    schedule 02.01.2014