2014-06-01 3 views
0

Каков наилучший способ связать состояния нескольких NSMenuItems, как показано во многих приложениях View → Sort By меню, чтобы они были взаимоисключающими? Вот скриншот из почты, как например:Как связать состояния нескольких NSMenuItems, чтобы они были взаимоисключающими?

enter image description here

Я нашел следующий отрывок в документации, но я не уверен, как это реализовать:

Вы можете использовать состояния для реализации группы взаимно эксклюзивное меню элементов, очень похоже на группу переключателей. Например, в игре есть три пункта меню, чтобы показать уровень игры: Новичок, Промежуточный и Расширенный. Чтобы реализовать такую ​​группу, создайте одно сообщение , которое все они используют. Это сообщение о действии изменяет соответствующую настройку , а затем отражает это изменение, сняв флажок в текущем отмеченном пункте и проверяя вновь выбранный элемент.

+1

Что вы не уверены? Вы знаете, как настроить цель и действие для пункта меню? Вы знаете, как установить одну и ту же цель и действие для нескольких пунктов меню? Вы знаете, как писать методы действий, как правило? В рамках метода действия вы знаете, как идентифицировать отправителя и отличать его от других возможных отправителей? Вы знаете, как установить состояние элемента меню? –

+0

Хорошо, я никогда не обнаружил отправителя и отличил его от других возможных отправителей. Поэтому мне никогда не приходило в голову сделать это в этой конкретной ситуации. И тогда мне нужны Outlets для каждого пункта меню, поэтому я могу установить соответствующие состояния «вручную»? – MartinW

ответ

3

Обычный способ отличия отправителей - назначить каждому уникальный тег в IB. Затем используйте [sender tag], чтобы получить этот тег в методе действий.

Чтобы найти старый отмеченный элемент для состояния, от которого вы переключаетесь, вы можете использовать [[sender menu] itemWithTag:tagForOldState]. Однако, если есть вероятность того, что одно и то же состояние будет отображаться в нескольких меню (например, в главном меню и контекстном меню), вам следует рассмотреть возможность внедрения -validateMenuItem: в том же классе, который реализует метод действия. В этом методе вы можете проверить товар -action и -tag, чтобы решить, следует ли его проверять на основании текущего состояния программы. Затем позвоните по телефону -setState:, чтобы применить соответствующее состояние.

Например:

- (BOOL) validateMenuItem:(NSMenuItem*)menuItem 
{ 
    if ([menuItem action] == @selector(sortBy:)) 
     [menuItem setState:([menuItem tag] == currentSortOrderTag) ? NSOnState : NSOffState]; 
    return YES; 
} 
+0

Спасибо. Я узнал, как отключать отправители, назначая теги моим пунктам меню. – MartinW

+0

Тем не менее, я не нашел элегантного способа, как закодировать мой метод setSortOrder: (id). У меня есть три пункта меню Outlets (sortByAuthorMenuItem, sortByTitleMenuItem, sortByYearMenuItem) и выход для моего NSArrayController (booksArrayController). Я знаю, что это непопулярный запрос на SO, но не могли бы вы показать мне, как выглядела бы элегантная версия моего - (void) setSortOrder: (id) отправителя? – MartinW

+1

Вы можете установить теги пунктов меню в индексы в массив дескрипторов сортировки. Затем вы установите дескриптор сортировки контроллера массива, указав его в массив тегом отправителя. В качестве альтернативы вы можете установить каждый элемент представленного элемента в представленный дескриптор сортировки. Затем вы установите дескриптор сортировки контроллера массива в 'presentObject' отправителя. –

Смежные вопросы