Привязка к NSUserDefaults, которая содержит массив словарей - PullRequest
1 голос
/ 27 марта 2012

У меня есть элемент NSUserDefaults, представляющий собой массив словарей. Каждый словарь в этом массиве соответствует объекту, который определяет свойства, которые мне нужны в NSMenuItem. Одним из этих свойств ключа / значения в каждом словаре является логическое значение, определяющее, должен ли элемент меню отображаться или скрываться. Ключом для этого значения является «шоу». Вот наглядный пример:

MenuItems      (Array)
  Item 0       (Dictionary)
    label      (String)      "Menu Item 1"
    show       (Boolean)     YES
  Item 1       (Dictionary)
    label      (String)      "Menu Item 2"
    show       (Boolean)     NO

В этом случае первый пункт меню будет показан, а второй нет. Я хочу, чтобы это динамически обновлялось при изменении настроек пользователя по умолчанию (через панель настроек).

В идеале я бы хотел связать атрибут "hidden" в NSMenuItem непосредственно с соответствующим значением "show". К сожалению, согласно NSMenuItem Bindings , скрытый не является чем-то, что может быть связано. Но я все равно попробовал, и я не уверен, что я буду работать. Сложность заключается в том, что это массив словарей, и мне не ясно, как здесь будут работать привязки. У меня есть NSArrayController, связанный с sharedIserDefaults MenuItems, и я могу видеть различные фрагменты данных через упорядоченные объекты во время отладки.

Я много чего пробовал:

  • Привязка непосредственно к значению словаря
  • Создание оберточного NSObjectController для каждого словаря и привязка к ключевому пути "content.show"
  • Наблюдение за самим словарем через addObserver: forKeyPath: options: context
  • Наблюдение за упакованным NSObjectController, как описано выше.

Ничто из этого не вызывает ничего. Наблюдение за NSOrrayController с помощьюOreObjects напрямую, тем не менее, запускает наблюдаемостьValueForKeyPath: ... но это на самом деле не сильно отличается от того, что требуется для всего свинца и использования NSUserDefaultsDidChangeNotification.

Есть ли способ решить эту проблему с помощью привязок или KVO, которые приведут меня к уровню детализации, который я ищу?

1 Ответ

0 голосов
/ 27 марта 2012

Скрытое свойство MenuItem можно привязать, оно есть в списке вариантов в IB.Тем не менее, вы не можете связать объект в массиве, теперь есть способ сказать, по сути, array.object1.Я думаю, что вы могли бы делать то, что вы хотите, если вы сделаете своего пользователя по умолчанию словарем словарей - ключи на верхнем уровне могут быть «menuItem1», «menuItem2» и т. Д. Со значением, являющимся словарем со всеми остальными необходимыми вам ключами,Трудно сказать, сработает ли это, не зная, что еще у вас есть в ваших пользовательских настройках по умолчанию.Если бы это могло работать, вы могли бы получить нужную информацию с помощью valueForKeyPath: например, dict.menuItem1.show

...