2012-03-19 3 views
1

Я не знаю, как описать то, что мне нужно, но я дам ему попробовать, с помощью примера:Подключение нескольких NSMenuItems с действий и переменных состояния

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

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

  • Пользователь может переключаться на боковой панели с помощью пункта в главном меню (например, Показать боковую панель/Hide Sidebar)
  • Пользователь также может переключить боковую панель с помощью кнопка
  • И есть еще один пункт, в другом меню, чтобы сделать ту же самую вещь (Show/Hide Sidebar)

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

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

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

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

Спасибо!

ответ

3

Я предполагаю, что у вас есть объект контроллера, который реализует действие -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 
} 
+0

Отлично! Я проверю это! Большое спасибо ;-) –