NSValueTransformer не вызывается - PullRequest
1 голос
/ 30 июня 2011

У меня есть общий список пользователей по умолчанию, который выглядит примерно так:

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. Если это так, то как правильно это сделать?

1 Ответ

1 голос
/ 01 июля 2011

Я только что использовал NSNegateBooleanTransformerName (что-то, что я нашел сегодня). Я собираюсь предположить, что в моем преобразователе значений было что-то глупое или что это связано с попыткой привязки к NSMutableDictionary в качестве примера проекта, который я создал и который не использовал словарь, работал нормально.

Редактировать: Это было что-то в моем преобразователе, поскольку NSNegateBooleanTransformer работает нормально, даже со словарем в миксе. (В любом случае конфликт там не имел бы смысла).

Мне бы хотелось, чтобы кто-то объяснил, почему преобразователь значения на основе приведенного выше кода (должен быть таким же, как NSNegateBooleanTransformer) не работает, и я бы изменил свой ответ.

...