Соединение нескольких NSMenuItems с действиями и переменными состояния - PullRequest
1 голос
/ 19 марта 2012

Я не уверен, как описать то, что мне нужно, но я попробую, на примере:

Допустим, у нас есть окно и боковая панель, и мы хотим ее переключать (я имею в виду боковую панель: вкл / выкл).

Теперь, давайте также скажем, что:

  • Пользователь может переключать боковую панель с помощью элемента в главном меню (например, Показать боковую панель / Скрыть боковую панель)
  • Пользователь также может переключать боковую панель с помощью кнопки
  • И есть еще один пункт, в каком-то другом меню, чтобы сделать то же самое (Показать / Скрыть боковую панель)

Каким будет наиболее практичный подход для достижения какао?

Конечно, это означает, что, например, :

  • Когда кто-то нажимает кнопку, кроме боковой панели (показывает или скрывает), пункты меню теперь должны отображать текущее состояние боковой панели (например, «Показать боковую панель» теперь должно превращаться в «Скрыть боковую панель» во всех возможных случаях) в меню и т. д.)

Я надеюсь, вы поняли идею; это определенно не что-то сложное; но я определенно запутался в том, как я могу использовать все уловки Какао, чтобы сделать это быстро.

Спасибо!

1 Ответ

3 голосов
/ 19 марта 2012

Я предполагаю, что у вас есть некоторый объект контроллера, который реализует действие -toggleSidebar:, и оба меню предназначены для одного и того же контроллера. Также в контроллере вы храните переменную экземпляра BOOL isSidebarShown.

Заставьте ваш контроллер реализовывать протокол NSUserInterfaceValidations. Как то так:

- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem
{
    if (anItem.action == @selector(toggleSidebar:) && [anItem isKindOfClass:[NSMenuItem class]])
    {
        NSString* title = isSidebarShown ? @"Hide Sidebar" : @"Show Sidebar";
        [(NSMenuItem*)anItem setTitle:title];
    }

    return YES;  // either way, the menu item is enabled
}
...