Что конкретно делает NSHandlesContentAsCompoundValueBindingOption привязки Какао? - PullRequest
6 голосов
/ 31 мая 2011

При связывании contentArray NSArrayController с NSUserDefaultsController необходимо установить флажок «Обрабатывать содержимое как составное значение» в привязке.Это стало общепринятым мнением, но что на самом деле делает опция?

Я написал небольшое тестовое приложение и заметил, что при включенной опции все contentArray передается setValue:forKey: источника привязки.всякий раз, когда вы редактируете свойство элемента в массиве.Когда опция отключена, изменяется только сам объект-элемент, а источник привязки не уведомляется.

Это объясняет, почему эта опция необходима для работы NSUserDefaultsController (в противном случае она не заметит, что выредактировать что-то в массиве и никогда не сохранять изменения).Но это не объясняет, кто делает то, что по-другому точно.Контроллер массива берет на себя ответственность за эту опцию и записывает обратно массив содержимого, когда он наблюдает изменение?Если да, то как это соотносится с заявленным назначением опции, которая заключается в том, чтобы «использовать обратимый преобразователь значений, чтобы [...] временно преобразовать составные значения в меньшие части»?

1 Ответ

2 голосов
/ 17 августа 2011

Поток сообщений здесь объясняется довольно хорошо: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/MessageFlow.html#//apple_ref/doc/uid/TP40002149-186285

Вот моя попытка ответить:

  1. Исходный объект содержимого, указанный в contentObject, contentArrayили contentSet привязка извлекается из NSUserDefaultsController с использованием valueForKeyPath:
  2. Этот объект содержимого преобразуется с использованием метода transformedValue: преобразователя значения
  3. Новое значение от пользователя вставляется в преобразованноеобъект содержимого
  4. Объект содержимого преобразуется в обратном порядке с использованием inverseTransformedValue:
  5. Новый объект содержимого с обратным преобразованием устанавливается в качестве нового объекта содержимого и передается в NSUserDefaultsController с использованием setValue:forKeyPath:
...