Поток сообщений привязки
Привязка имеет много возможных вариантов, которые могут быть сконфигурированы, и многие из них будут влиять на поток сообщений между контроллером, представлением и объектами модели. Преобразователи значения, NSFormatters, проверка значения ключа, заполнители, маркеры значения выбора и другие параметры привязки, все изменения влияния, внесенные в пользовательском интерфейсе, и в значениях модели. Эта статья описывает поток сообщений между объектами для общих взаимодействий с представлением, контроллером и объектами модели.
Изменение значения свойства модели
Схема на рисунке 1 показывает поток сообщений между моделью, контроллером и объектами представления в ответ на изменение значения свойства в объекте модели.
В частности этот пример имеет NSTextField с value
привязка связанного с выбором NSObjectController с помощью selection.firstName
ключевой путь. NSObjectController content
привязка связывается с объектом модели, инкапсулирующим имя и адрес лица.
Свойство объекта модели изменяется с помощью наблюдения значения ключа совместимые средние значения.
Объекты, регистрирующиеся в объекте модели для получения значения ключа, наблюдая уведомления изменения, отправляются
observeValueForKeyPath:ofObject:change:context:
сообщение наследованной реализацией наблюдения значения ключа объекта модели.Контроллер получает
observeValueForKeyPath:ofObject:change:context:
сообщение. Контроллер регистрируется в объекте модели, в результате устанавливающем привязку с объектом модели.Контроллер тестирует, чтобы видеть, установили ли привязке модели контроллером опцию «Handles as Compound Value». Если “Дескрипторы, поскольку Составное Значение” включено, продолжите к Шагу 13.
Контроллер генерирует сообщение наблюдения значения ключа для значения, изменившегося, отобразив ключевой путь модели к надлежащему ключевому пути контроллера. Например, если ключевой путь свойства в объекте модели “
firstName
” тогда изменение наблюдения значения ключа отображается на “selection.firstName
”.Объекты, регистрирующиеся в объекте контроллера получить значение ключа, наблюдая уведомления изменения, отправляются
observeValueForKeyPath:ofObject:change:context:
сообщение наследованной реализацией наблюдения значения ключа объекта контроллера.Представление получает
observeValueForKeyPath:ofObject:change:context:
сообщение. Представление регистрируется в объекте контроллера в результате установление привязки с объектом контроллера.Объекты представления получают текущую стоимость для измененного свойства от контроллера с помощью кодирования значения ключа.
Представление тестирует значение, полученное на Шаге 8. Если значение является одним из маркеров выбора, или
nil
, продолжите к Шагу 15.Если привязка контроллера представления указывает преобразователь значения, значение, полученное на Шаге 8, передается преобразователю значения
transformedValue:
метод. Значение, возвращенноеtransformedValue:
метод передается следующему шагу.Представление устанавливает свое содержание в обновленный, возможно преобразованный, значение с помощью представления
setObjectValue:
метод.Если представлению присоединили NSFormatter к нему, значение отформатировано экземпляром NSFormatter. Продолжите к Шагу 17.
Если привязка модели контроллером указывает преобразователь значения, вся модель преобразовывается с помощью
transformedValue:
метод.Контроллер генерирует сообщение наблюдения значения ключа, отображая ключевой путь к выбору. Это генерирует тот же тип значения ключа, наблюдая уведомление изменения, которое привело бы к замене объекта содержания. Продолжите к Шагу 7.
Если привязка указывает заполнителя для привязки контроллера представления для маркера значения, это используется на Шаге 16. Если никакое пользовательское значение заполнителя не указано как часть привязки, и пользовательский заполнитель по умолчанию был установлен для класса представления и этой определенной привязки, это используется на Шаге 16. Иначе, поток возвращается к Шагу 11.
Приложение может присвоить пользовательского заполнителя по умолчанию для класса и обязательной комбинации с помощью метода класса NSPlaceholders
setDefaultPlaceholder:forMarker:withBinding:
.Значение заполнителя установлено для представления с помощью
setPlaceholderString:
илиsetPlaceholderAttributedString:
метод.Обновленное значение выведено на экран в пользовательском интерфейсе.
Пользователь обновляет значение в пользовательском интерфейсе
Схемы на рисунке 2 и рисунке 3 показывают поток сообщений между моделью, контроллером и просматривают объекты в ответ на изменение значения свойства в объекте модели.
Как в “Изменении Значения Свойства Модели” этот определенный пример имеет NSTextField с value
привязка связанного с выбором NSObjectController с помощью selection.firstName
ключевой путь. NSObjectController content
привязка связывается с объектом модели, инкапсулирующим имя и адрес лица.
Пользователь вводит новое значение в NSTextField.
Если NSFormatter присоединен к NSTextField, средство форматирования пытается проверить значение. Если средству форматирования не удается проверить значение, это обеспечивает обратную связь отказа и возвращает управление пользователю.
Параметр привязки контроллера представления “Постоянно Обновляет Значение”, определяет, когда представление уведомляет контроллер изменений в текстовом поле. Если это, эта опция указана, контроллер, будет обновлено для каждого нажатия клавиши. Если это отключено тогда, контроллер только обновляется, когда пользователь поражает возврат, вкладку, или текстовое поле теряет первое состояние респондента.
Если привязка контроллера представления указывает преобразователь значения, и преобразователь значения поддерживает обратные преобразования, новое значение преобразовывается с помощью
inverseTransformedValue:
метод. Значение, возвращенноеinverseTransformedValue:
метод передается следующему шагу.Если параметр привязки контроллера представления “сразу Проверяет”, включен, то продолжите к Шагу 8.
Объект представления вызывает
setValue:forKeyPath:
на объекте контроллера, передавая новое, возможно преобразованное, объектное значение и ключевой путь привязки как параметры.Если параметр привязки модели контроллером “Дескриптор как Составное Значение” включен, то продолжите к Шагу 15.
Контроллер вызывает
setValue:forKeyPath:
на объекте модели, передавая новое довольное значение от Шага 5 и ключевого пути для свойства в объекте модели как параметры. Продолжите к Шагу 23.Представление пытается проверить значение от Шага 4 с помощью проверки значения ключа. Это делает это путем вызова
validateValue:forKeyPath:error:
на контроллере, передавая предложенное значение, ключевой путь привязки и ссылку указателя NSError как параметры.Контроллер получает
validateValue:forKeyPath:error:
обменивайтесь сообщениями и передает запрос проверки к объекту моделиvalidateValue:forKeyPath:error:
реализация, изменяя ключевой путь так, чтобы это сослалось на надлежащее свойство объекта модели.Объект модели получает
validateValue:forKeyPath:error:
сообщение и попытки проверить предложенное значение путем вызоваvalidate<Key>:error:
на сам. Определенная сигнатура метода будет зависеть от имени свойства.Реализация объекта модели
validate<Key>:error:
возвращает булево значение, указывающее, было ли значение допустимо. Если результатYES
, тогда предложенное значение было допустимо, или было заменено проверенным значением. Если результатNO
, тогда предложенное значение недопустимо, и ошибочная ссылка должна содержать описание того, почему проверка перестала работать.Результат проверки, значение и возможная ошибка возвращаются реализацией модели
validate<Key>:error:
к контроллеруvalidateValue:forKeyPath:error:
метод.Результат проверки, значение и возможная ошибка возвращаются контроллером
validateValue:forKeyPath:error:
метод к представлению.Если результат проверки
YES
, тогда допустимое или принужденное значение возвращается к Шагу 5, иначе продолжается к Шагу 14.Пользователь уведомляется, что значение недопустимо.
То, как ошибка представлена пользователю, зависит от опции «Always Presents Application Modal Alert Panels» привязки контроллера представления. Если эта опция включена, то ошибка выведена на экран пользователю как модальная предупредительная панель. Если это не включено, то ошибка представлена пользователю как лист.
Контроллер получает текущее использование объекта содержания
valueForKeyPath:
на объекте модели.Это - путь потока сообщений для “Дескриптора как Составное Значение”. Исходный объект содержания, указанный
contentObject
,contentArray
илиcontentSet
привязка получена от модели, преобразованной, новое значение от введенного пользователя, объект содержания обратный преобразованный, и набор как новый объект содержания.Если привязка модели контроллером указывает преобразователь значения, объект содержания, полученный на Шаге 15, преобразовывается с помощью
transformedValue:
метод. Значение, возвращенноеtransformedValue:
метод передается следующему шагу.Контроллер вызывает
setValue:forKeyPath:
на полученном, возможно преобразованном, объект содержания. Значение от Шага 5 и ключевого пути для свойства в объекте модели как параметры.Если привязка модели контроллером указывает преобразователь значения, и преобразователь значения поддерживает обратные преобразования, объект содержания от Шага 17 преобразовывается с помощью
inverseTransformedValue:
метод. Значение, возвращенноеinverseTransformedValue:
метод передается следующему шагу.Если параметр привязки модели контроллером “сразу Проверяет”, включен, продолжите к Шагу 20, иначе продолжитесь к Шагу 22.
Контроллер пытается проверить новое, возможно преобразованное, объект содержания путем вызова
validateValue:forKeyPath:error:
на объекте модели.Если
validateValue:forKeyPath:error:
возвратыYES
, тогда допустимое или принужденное допустимое значение передается Шагу 22. Если результат недопустим, продолжите к Шагу 21.Пользователь уведомляется, что значение недопустимо.
То, как ошибка представлена пользователю, зависит от опции «Always Presents Application Modal Alert Panels» привязки контроллера контроллера. Если эта опция включена, то ошибка выведена на экран пользователю как модальная предупредительная панель. Если это не включено, то ошибка представлена пользователю как лист.
Контроллер вызывает
setValue:forKeyPath:
на объекте модели с помощью нового возможно проверенный объект содержания и ключ содержания соединяют каналом как параметры.Обновленное значение теперь сохранено в объекте модели.
Изменение объекта модели приводит к значению ключа, наблюдая уведомления изменения, отправляемые наблюдателям свойства модели.