Тривиально настроить меню 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 должен принимать два контроллера массива: один для статического контента (нет и разделитель) и один для динамического контента, который работает с тегами замены контента. Это сделает все варианты действительными.
selectedIndex
должен помочь. Кроме того, даже с настроенными привязками вы всегда можете использовать целевое действие, чтобы узнать, когда всплывающее окно было изменено, и запросить его выбор. И у пользователя не должно быть возможности выбрать элемент разделителя. - person Ken Thomases   schedule 26.07.2014