Прежде всего, создайте класс объекта модели, представляющий язык, и сделайте эти пары словаря свойствами объектов модели. По моему опыту, словари плохо работают с Bindings; система привязок хочет объекты реальной модели.
Затем создайте объект контроллера для хранения этих объектов модели. Я назову это LanguageKeeper. Он имеет три свойства:
languages
(NSArray of Language objects)
selectedLanguage
selectedLanguageISOName
Выставьте последний как обязательный. Кроме того, сделайте одно из двух последних свойств производным от другого. Я бы сделал производное свойства ISOName: получатель вернет self.selectedLanguage.ISOName
, а установщик выполнит поиск заданного имени ISO и установит self.selectedLanguage
для этого языкового объекта. Убедитесь, что реализованы keyPathsForValuesAffectingSelectedLanguage
и keyPathsForValuesAffectingSelectedLanguageISOName
, а также имя другого свойства в наборе, который возвращает каждый метод.
Сначала свяжите привязку массива содержимого NSArrayController со свойством languages
LanguageKeeper.
Затем свяжите три свойства с помощью всплывающей кнопки:
- содержимое для свойства
arrangedObjects
NSArrayController, оставляя путь к ключу модели пустым (или установите его на self
, если это вызывает проблемы)
- значения содержимого для того же свойства
arrangedObjects
, с путем ключа модели «fullName
»
- выделенный объект для свойства
selectedLanguage
LanguageKeeper
Наконец, свяжите selectedLanguageISOName
на LanguageKeeper с соответствующим свойством контроллера по умолчанию. (Вы не можете привязать всплывающую кнопку непосредственно к УДК, поскольку для всплывающей кнопки требуется один из объектов вашей модели.)
Вы также можете попробовать привязать привязку содержимого всплывающей кнопки к isoName
s и привязку значений содержимого к fullName
s словарей в массиве, но я очень не доверяю использованию примитивных объектов модельные объекты. У меня было слишком много проблем от этого в прошлом. Кроме того, использование объектов модели в конечном итоге окупается, и с ними очень интересно работать.
Итак, со всем вышеперечисленным, вот что происходит:
Пользователь меняет значение во всплывающей кнопке
- Всплывающая кнопка изменяет значение свойства selected-object.
- Это изменяет свойство
selectedLanguage
LanguageKeeper.
- Это меняет другое свойство (
selectedLanguageISOName
) LanguageKeeper.
- Это изменяет значение в пользовательских значениях по умолчанию через UDC.
Некоторые другие объекты изменяют значение в пользовательских значениях по умолчанию
- УДК публикует уведомления об изменении значения.
- Это изменяет свойство
selectedLanguageISOName
LanguageKeeper.
- Это меняет другое свойство (
selectedLanguage
) LanguageKeeper.
- Изменяет значение свойства selected-объекта всплывающей кнопки.
- Пользователь видит новый выбор
fullName
во всплывающем меню.
Если вы не понимаете какую-либо часть этого ответа, пожалуйста, попросите разъяснений.