validateMenuItem для отключения определенных c пунктов меню - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в macOS XCode Obj- C, так что несите меня. Я пытаюсь использовать validateMenuItem, чтобы отключить и включить определенные c элементы меню.

В настоящее время я работаю, чтобы отключить и включить * все элементы меню:

BOOL g_bEnableAllMenus = YES;

, а затем Я использую validateMenuItem

- (BOOL)validateMenuItem:(NSMenuItem *)item
{
    if( !g_bEnableAllMenus  )
        return NO;

    return YES;
}

Для проверки я вызываю g_bEnableAllMenus в awakeFromNib, и он правильно отключает все мои пункты меню.

- (void)awakeFromNib {
    g_bEnableAllMenus = NO; 
}

Что я Я пытаюсь сделать сейчас этот сценарий:

Вместо g_bEnableAllMenu s отключения и включения ВСЕХ пунктов меню при вызове g_bEnableAllMenus = YES/NO;, я хочу, чтобы он отключил все пункты меню, ЗА ИСКЛЮЧЕНИЕМ списка нескольких других пунктов меню под меню под названием TestMenu.

Затем я хочу, чтобы этот список других пунктов меню в TestMenu отдельно контролировался с помощью другого BOOL: чтобы я мог включать и отключать этот пункт меню отдельно и не изменять его с помощью g_bEnableAllMenus - только g_bEnableTestMenu.

BOOL g_bEnableTestMenu = YES;

Вот где я застрял. Я думаю, мне нужно использовать некоторую комбинацию [item action] == @selector(TestMenuItem:) в validateMenuItem, поэтому, когда g_bEnableTestMenu == NO он отключает все пункты меню в моем TestMenu (но не касается других пунктов меню).

Затем, когда g_bEnableAllMenus == NO он по-прежнему отключает все мои меню (как это правильно сейчас), но исключает мое TestMenu.

1 Ответ

1 голос
/ 19 июня 2020

Вот более конкретный ответ, основанный на моем вышеупомянутом комментарии.

Вы можете установить значение тега в пункте меню, чтобы избежать совпадения по действию / селектору. Если вы создаете пункты меню в коде, просто установите свойство .tag напрямую; в макете .xib установите его на вкладке основных свойств пункта меню:

screenshot of menu properties user-interface

Затем в обработчике проверки вы можете просто проверить диапазон тег:

func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
    if item.tag >= 1000 && item.tag <= 1100 {
        // return your test validation logic result
    } else {
        // return your normal validation result
    }
}

Конечно, вы могли бы улучшить этот образец, определив константы для диапазона min и max тега test-menu-item или с другими структурами данных (например, перечисление CaseIterable тега test-item ценности). Возможно, вы захотите использовать теги для других групп команд, которые имеют общий журнал проверки c, который не всегда определяется селекторами / цепочкой респондентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...