Работа с нестандартными элементами меню в NSPopUpButton

Тривиально настроить меню NSPopUpButton через привязку к NSArrayController. Немного более сложный, но очень частый вариант использования — использовать NSContentPlacementTagBindingOption для вставки элементов массива в меню из указанного индекса. Хороший пример этого приведен здесь, NSPopUpButton + Bindings + Show All Option.

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

                       _________________
Select table column:  |____None_________|   <--- this is the popup

В меню могут быть следующие пункты,

_______________
|    None     |   <-- Out of model item, "None" or empty selection
 -------------    <-- Out of model item, separator item
|  column 1   |   <-- These are dynamically replaced menu
|  column 2   |       item done using bindings and the
|  column 3   |       NSContentPlacementTagBindingOption
|_____________|       option from IB.

Обратите внимание, что в меню есть два элемента, не относящихся к модели, они вставлены в пользовательский интерфейс в IB перед тегом замены содержимого. Использование тега замены содержимого значительно упрощает заполнение меню и синхронизацию элементов с моделью. Однако это вызывает огромные проблемы, когда использование делает выбор, который находится за пределами содержимого связанного массива: маркер "Нет" и элемент-разделитель. Поскольку они находятся за пределами массива, они не могут стать выбранными элементами. Таким образом, привязку selected object всплывающей кнопки нельзя использовать для отслеживания изменений выбора из пользовательского интерфейса в модель.

Кто-нибудь нашел успешный способ работы с NSContentPlacementTagBindingOption, NSPopUpButton и немодельными (статическими) пунктами в меню?

Я почти готов сдаться и заполнить меню вручную, что было бы отстойно.

NSPopUpButton должен принимать два контроллера массива: один для статического контента (нет и разделитель) и один для динамического контента, который работает с тегами замены контента. Это сделает все варианты действительными.


person Daniel Farrell    schedule 25.07.2014    source источник
comment
Всплывающие кнопки поддерживают другие привязки выбора; в частности, selectedIndex должен помочь. Кроме того, даже с настроенными привязками вы всегда можете использовать целевое действие, чтобы узнать, когда всплывающее окно было изменено, и запросить его выбор. И у пользователя не должно быть возможности выбрать элемент разделителя.   -  person Ken Thomases    schedule 26.07.2014
comment
Да, некоторое творческое сочетание привязок и цели/действия, вероятно, является решением. Одна вещь, которая меня удивила, заключается в том, что даже при использовании выбранной привязки индекса возникают проблемы, потому что кажется, что она возвращается в индексе элемента контроллеров массива! Следовательно, делает немодельные элементы недоступными для выбора. Единственный способ обойти это - не привязываться ни к одному из выбранных параметров всплывающего окна и, как вы предложили, использовать цель/действие. Пока еще нет хорошего чистого решения, прокомментирую, когда будет!   -  person Daniel Farrell    schedule 26.07.2014