Отключение/включение пункта меню приложения

Пытаясь изучить самые основы работы с меню. Панель меню моего тестового приложения имеет 3 меню, а именно «TestApp», «Файл» и «Справка». Я обнаружил, что могу полностью удалить эти меню, просто вызвав команду say:

NSMenu* rootMenu = [NSApp mainMenu];
[rootMenu removeItemAtIndex:2];

Тем не менее, я бы только хотел временно отключить их (серым цветом). Есть ли такой же простой способ сделать это, пожалуйста?


person Bender    schedule 18.01.2010    source источник


Ответы (1)


Я могу неправильно понять ваш вопрос, но, похоже, вы хотите иметь возможность затенить фактические заголовки меню, которые появляются в строке меню системы (например, затенить меню «Файл»). Я не уверен, что это вообще возможно, но это определенно противоречит Руководство по пользовательскому интерфейсу Apple:

Заголовок меню отображается незатененным, даже если все команды меню недоступны (затенены) одновременно. Пользователи всегда должны иметь возможность просматривать содержимое меню, независимо от того, доступно оно в данный момент или нет.

Таким образом, реальное решение проблемы состоит в том, чтобы сделать все пункты меню в определенном меню серыми, когда ваше приложение находится в определенном состоянии. Для этого реализуйте протокол NSUserInterfaceValidations. Требуется только реализация метода - (BOOL)validateUserInterfaceItem:. Как правило, при реализации этого метода вы просто проверяете селектор проверяемого элемента пользовательского интерфейса и возвращаете YES, если он должен быть включен, или NO, если он не должен (что делает пункт меню серым).

person CJ.    schedule 18.01.2010
comment
Да, ты правильно понял, CJ. Я пытался затемнить сами меню «Файл» и/или «Правка», а не их соответствующие элементы, и не знал об этом критическом абзаце в Руководстве Apple по человеческому интерфейсу, указывающем, что я не должен делать это таким образом. Я включил метод - (BOOL)validateUserInterfaceItem: в свой код, и он отлично работает. Такое простое решение. Бесконечно благодарен :-) - person Bender; 19.01.2010