Изменение видимости элементов NSPopUpButton на основе нажатия клавиши

У меня есть приложение, которому нужно прочитать кучу данных из внешнего файла и отобразить его как NSPopUpButton в пользовательском интерфейсе Cocoa. Загвоздка здесь в том, что данные, которые считываются, должны иметь флаг, указывающий, считаются ли они «скрытыми» или нет.

Если данные скрыты, их нужно добавить в NSPopUpButton как NSMenuItem, но флаг hidden нужно установить на YES, чтобы он обычно не отображался в меню NSPopUpButton. Если пользователь удерживает «волшебную клавишу» на своей клавиатуре (в данном случае обычно ALT), то эти скрытые объекты необходимо отобразить. Если пользователь отпускает клавишу ALT, то они должны быть автоматически повторно скрыты, за исключением того, который мог быть выбран — который стал бы скрытым, если бы был выбран другой NSMenuItem.

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

Мне было интересно, есть ли прямой способ сделать это, используя NSArrayController и NSPopUpButton, но до сих пор я не смог найти ничего похожего на решение - не когда дело доходит до управления скрытым свойством объектов NSMenuItem.

Кто-нибудь знает, как этого можно добиться с помощью Cocoa Bindings?


person Community    schedule 29.11.2011    source источник


Ответы (1)


Вы можете подключить всплывающее окно к контроллеру массива и изменить предикат фильтра. С точки зрения дизайна MVC вы бы не использовали такой атрибут, как «скрытый», который является характеристикой представления, но, возможно, «расширенный». Обычно для предиката фильтра на контроллере массива устанавливается значение «advanced = no». Затем, когда пользователь держит ваш предпочтительный модификатор, удалите предикат. Всплывающее окно будет обновляться автоматически. Контроллер массива должен быть привязан к свойству массива другого объекта (в вашей модели данных). Всплывающее окно должно быть привязано к аранжированным объектам на контроллере массива.

person Bored Astronaut    schedule 29.11.2011
comment
Тогда как мне настроить все так, чтобы, если был выбран ранее скрытый NSMenuItem, он не скрывался повторно, пока вместо этого не был выбран какой-либо другой NSMenuItem? - person ; 29.11.2011
comment
Есть несколько способов. Вы можете понизить базовый объект модели, сделав его более продвинутым, или вы можете расширить предикат фильтра, чтобы добавить исключение для этого объекта. Хотя, возможно, более дружелюбным поведением было бы воздержаться от удаления каких-либо дополнительных параметров, пока всплывающее окно все еще активно. Сбрасывайте предикат фильтра только после закрытия всплывающего окна. Просто предложение. - person Bored Astronaut; 30.11.2011
comment
Да, это предполагаемое поведение, и я уже закодировал его. Я пытаюсь выяснить, могу ли я настроить предикат так, чтобы он каким-то образом соответствовал текущему объекту, который он итерирует, с указателем объекта, и если они равны, игнорируйте расширенное поле все вместе и позволяйте объекту оставаться видимым. Таким образом, текущий выбранный элемент NSPopUpButton всегда виден независимо от установленного им расширенного свойства (ДА или НЕТ). - person ; 30.11.2011