У меня есть общий список пользователей по умолчанию, который выглядит примерно так:
menuItems (Array)
Item 0 (Dictionary)
name (String) "Menu Item 0"
show (Boolean) NO
Item 1 (Dictionary)
name (String) "Menu Item 1"
show (Boolean) YES
и т. Д.
У меня есть NSArrayController, массив содержимого которого привязан к общему контроллеру пользователя по умолчанию с ключом контроллера = «значения» и ключом модели Path = «menuItems». У меня включено «Обрабатывает содержимое как составное значение». Его режим контроллера объектов - «Класс», а имя класса, которым он управляет, - NSMutableDictionary.
Желаемым результатом является привязка скрытого свойства NSMenuItems к записям show в plist. Однако вы заметите, что «скрытый» и «показ» являются противоположностями, поэтому я создал NSValueTransformer, который просто делает:
return [NSNumber numberWithBool:!value];
Я установил привязку следующим образом, где «item» - это NSMenuItem, «valueTransformer» - это выделенный и инициализированный преобразователь, как описано выше, а paneNum - это индекс, где можно найти подходящий словарь для соответствующий пункт меню:
NSDictionary *bindingOptions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSContinuouslyUpdatesValueBindingOption,
valueTransformer, NSValueTransformerBindingOption,
nil];
[item bind:@"hidden"
toObject:[[defaultsController arrangedObjects] objectAtIndex:paneNum]
withKeyPath:@"show"
options:bindingOptions];
Привязка, кажется, работает в определенной степени; пункты меню изначально отображаются или скрыты, но значениеTransformer никогда не используется, и поэтому «скрытность» каждого элемента меню обратная. (Кроме того, если plist изменяется, пункты меню «скрытность» также не обновляются автоматически, как я ожидал бы с привязками.)
Что я пропустил?
Кстати, я понимаю, что было бы проще просто сохранить «скрытый», а не «показывать» в списке, но сейчас я хочу понять, почему это не работает.
Редактировать: Я предполагаю, что это как-то связано с тем, что я пытаюсь привязать объект к NSMutableDictionary. Если это так, то как правильно это сделать?