Привязка двух разных путей к ключам модели к одному и тому же выбору NSArrayController - PullRequest
1 голос
/ 23 февраля 2009

Скажите, у меня есть следующий массив словарей:

{
    {
        isoName => en,
        fullName => English,
        localName => English
    },
    {
        isoName => de,
        fullName => German,
        localName => Deutsch
    },
    {
        isoName => fr,
        fullName => French,
        localName => français
    }
}

Как я могу привязать значения fullName к значениям элемента управления NSPopUpButton, но привязать isoName выбора к NSUserDefaults? У меня есть NSArrayController, настроенный с массивом, подобным приведенному выше, и мой NSPopUpButton привязан к этому контроллеру с путем к ключу модели как «fullName», но я хочу сохранить isoName в NSUserDefaults. Это возможно? Есть ли лучший способ приблизиться к этому?

1 Ответ

1 голос
/ 23 февраля 2009

Прежде всего, создайте класс объекта модели, представляющий язык, и сделайте эти пары словаря свойствами объектов модели. По моему опыту, словари плохо работают с 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 словарей в массиве, но я очень не доверяю использованию примитивных объектов модельные объекты. У меня было слишком много проблем от этого в прошлом. Кроме того, использование объектов модели в конечном итоге окупается, и с ними очень интересно работать.

Итак, со всем вышеперечисленным, вот что происходит:

Пользователь меняет значение во всплывающей кнопке
  1. Всплывающая кнопка изменяет значение свойства selected-object.
  2. Это изменяет свойство selectedLanguage LanguageKeeper.
  3. Это меняет другое свойство (selectedLanguageISOName) LanguageKeeper.
  4. Это изменяет значение в пользовательских значениях по умолчанию через UDC.
Некоторые другие объекты изменяют значение в пользовательских значениях по умолчанию
  1. УДК публикует уведомления об изменении значения.
  2. Это изменяет свойство selectedLanguageISOName LanguageKeeper.
  3. Это меняет другое свойство (selectedLanguage) LanguageKeeper.
  4. Изменяет значение свойства selected-объекта всплывающей кнопки.
  5. Пользователь видит новый выбор fullName во всплывающем меню.

Если вы не понимаете какую-либо часть этого ответа, пожалуйста, попросите разъяснений.

...