Что такое привязка какао?
В самом простом функциональном смысле технология привязки Какао обеспечивает, средние значения хранения модели и значений представления синхронизировались без Вас имеющий необходимость записать много “кода связующего звена”. Это позволяет Вам устанавливать установленное соединение между представлением и частью данных, «связывая» их таким образом, что изменение в каждый отражается в другом.
Эта статья описывает то, что предлагает технология и как это подает проще заявки записи. Это также представляет идею, что вместо того, чтобы полностью повторно реализовать существующее приложение для использования привязки можно включить привязку шаг за шагом.
Эта статья также описывает на концептуальном уровне, как привязка Какао работает, и шаблоны разработки, которые необходимо принять. Это дает краткий обзор шаблона разработки Контроллера представления Модели, и почему это выгодно. Это тогда дает концептуальный обзор того, как основные технологии, подкрепляющие привязку Какао — кодирование значения ключа, наблюдение значения ключа, и привязку значения ключа — работа, и как они находятся во взаимосвязи. Статья наконец объясняет роль классов контроллера, которые обеспечивает привязка Какао и почему необходимо использовать их.
Как Выполняют Работу Привязки? описывает технологии поддержки более подробно.
Преимущества Использования привязки
Одновременно уменьшая объем кода необходимо записать и поддержать, технология привязки Какао предлагает способ увеличить функциональность и непротиворечивость Вашего приложения. Это заботится о большинстве аспектов управления пользовательским интерфейсом для Вас путем разрешения Вам от загрузки, которую работа пользовательского связующего звена кодирует на допускающие повторное использование предварительно созданные контроллеры. Это помогает Вам создать полируемые, простые в использовании приложения, эффективно использующие объектные отношения, обеспечивающие поддающиеся сортировке таблицы и включающие интеллектуальное управление выбором.
Обычно Вы не должны полностью переписывать свое приложение для принятия привязки Какао. Например, вероятно, что можно факторизовать Пользовательские настройки, которые будут управляемы привязкой Какао, не влияя на остальную часть приложения. Если Ваше приложение примет рекомендуемые шаблоны разработки, Вы сочтете проще использовать привязку Какао.
Шаблон разработки Контроллера представления Модели
Приложения какао обычно принимают шаблон разработки Model-View-Controller (MVC). При разработке приложения Какао Вы обычно используете модель, представление и объекты контроллера, каждый из которых выполняет различную функцию. Объекты модели представляют данные и обычно сохраняются к файлу или некоторому другому постоянному хранилищу данных. Представление возражает атрибутам модели дисплея. Действие объектов контроллера как посредники, чтобы удостовериться, что то, что выводит на экран представление, является соответствующим соответствующему значению модели и что любые обновления пользователь делают к значению в представлении, распространено к модели. Понимание шаблона разработки MVC важно, чтобы полностью понять и эффективно использовать привязку Какао. Если необходимо знать больше, считайте “Шаблон разработки Контроллера представления Модели”.
При принятии шаблона разработки MVC большая часть кода приложения проще к повторному использованию, и расширитесь — можно снова использовать модель и просмотреть классы в различных приложениях. Большая часть реализации объекта контроллера состоит из того, что обычно упоминается как “код связующего звена”. Код связующего звена является кодом, сохраняющим значения модели и просматривающим, синхронизировался и уникален для каждого приложения. Это является обычно утомительным и громоздким для записи, способствует мало фундаментальной функции приложения, но необходимо сделать это хорошо для обеспечения хорошего пользовательского опыта.
Привязка какао заменяет большую часть кода связующего звена с допускающими повторное использование контроллерами и обеспечивает инфраструктуру, позволяющую Вам соединять пользовательский интерфейс с данными приложения.
Какао использует много терминов, обычно использующихся в информатике. Чтобы избежать неправильно понимать, они определяются в разделе «Terminology» Значения ключа, Кодирующего Руководство по программированию с их определенным значением в контексте привязки Какао.
Что такое привязка?
Привязка является атрибутом одного объекта, который может быть связан со свойством в другом таким образом, что изменение в любом отражается в другом. Например, привязка «значения» текстового поля могла бы быть связана с температурным атрибутом определенного объекта модели. Более обычно одна привязка могла бы указать, что объект контроллера «представляет» объект модели, и другая привязка могла бы указать, что значение текстового поля было связано к температурному свойству объекта, представленного контроллером.
Несмотря на то, что следующий концентрат в качестве примера на простых случаях, привязка не ограничивается дисплеем текстовых или числовых значений. Среди прочего привязка могла бы указать цвет, в котором должен быть выведен на экран текст, скрыто ли представление или нет, или какое сообщение и параметры должны быть отправлены, когда нажимается кнопка.
Простой пример
Возьмите в качестве примера очень простое приложение, в котором значения в текстовом поле и ползунке сохранены синхронизируемыми. Рассмотрите сначала реализацию, не использующую привязку. Текстовое поле и ползунок подключены непосредственно друг к другу использующему целевое действие, где каждый - цель других, и действие takeFloatValueFrom:
как показано на рисунке 2. (Если Вы не понимаете это, необходимо считать Начало работы С Какао.)
Этот пример иллюстрирует динамизм среды Какао — значения двух объектов пользовательского интерфейса сохранены синхронизируемыми, не пишущий кода, даже без компиляции. Это также служит для иллюстрирования шаблона разработки целевого действия (для большего количества подробных данных, считайте Парадигму Действия Target).
Главный дефект, от которого страдает этот пример, - то, что, как это, он не имеет почти никакого реального приложения. Для обнаружения значения, к которому или ползунок или текстовое поле были установлены и обновляют атрибут модели соответственно, Вы нуждаетесь в соединениях с текстовым полем и ползунком, и имеете для записи некоторого кода. Вы обычно используете контроллер, подключенный обоим (выходы использования) и с которым оба подключены (использование целевого действия), как проиллюстрировано на рисунке 3.
Когда пользователь перемещает ползунок, он отправляет сообщение действия в свою цель (контроллер). Контроллер поочередно обновляет значение в модели и синхронизирует пользовательский интерфейс (текстовое поле и ползунок). Несмотря на то, что этот пример не является особенно трудным, ситуация становится более сложной при использовании более сложных моделей и дисплеев, особенно при использовании, например, табличных представлений, позволяющих множественные выборы, или если значение может быть выведено на экран в различном окне. И необходимо записать весь код для поддержки этой функциональности.
Использование привязки какао предварительно созданные объекты контроллера (подклассы NSController) и технологии поддержки для хранения значений синхронизировалось автоматически. Проектирование приложений для реализации примера ползунка, использующего привязку, показано на рисунке 4.
Обратите внимание на то, что эта реализация не использует образец целевого действия. Ползунок не отправляет сообщение действия в контроллер. Вместо этого когда ползунок перемещается, это сообщает контроллеру непосредственно, что значение числа его содержания изменилось и каково значение. Контроллер обновляет модель и поочередно сообщает текстовому полю и ползунку, что изменилось значение, которое они выводят на экран. (В примерах, столь простых, как это контроллеры не действительно необходимо, однако в большинстве случаев, они.) Механизмы раньше передавали информацию, объяснены позже в этой статье и более подробно в том, Как Выполняют Работу Привязки?, но важно ценить, что в большинстве случаев Вы не должны будете писать код связующего звена.
Параметры привязки
Много привязки позволяют Вам указывать опции настроить их поведение. Существует три типа опции: преобразователи значения, заполнители и другие параметры.
Преобразователь значения, поскольку его имя подразумевает, применяет трансформацию к значению. Преобразователь значения может также позволить обратные трансформации. Платформа Основы обеспечивает абстрактный класс NSValueTransformer и несколько удобных преобразователей, включая тот, инвертирующий значение — т.е. это поворачивает булевскую переменную YES
в NO
(и наоборот). Можно также реализовать собственные преобразователи.
Чтобы видеть, как преобразователи могли бы быть полезными, предположите, что в предыдущем примере число в модели представляет температуру в градусах по Фаренгейту, но что Вы хотите вывести на экран значение в Цельсия. Вы могли реализовать обратимый преобразователь значения, преобразовывающий значения от одного масштаба до другого. Если Вы тогда указываете его как опцию преобразователя для текстового поля и ползунка, как показано на рисунке 5, экраны интерфейса пользователя, температура в Цельсия, и любые новые значения ввела использование ползунка или текстового поля, преобразованного в Фаренгейта.
Узнать больше о Руководстве по программированию Преобразователя Значения чтения преобразователей (статья также показывает реализацию Фаренгейта к преобразователю Цельсия).
Опции заполнителя позволяют Вам указывать то, что должно вывести на экран представление:; если значение свойства (ноль), с которым это связывается является нулевым, если нет никакого выбора; если существует множественный выбор; или если по некоторой другой причине значение не применимо.
Кроме того, для оценки преобразователей и заполнителей некоторая привязка предлагает множество других опций, такой как, обновляется ли значение привязки, поскольку редактирования сделаны к элементу интерфейса пользователя, или сконфигурировано ли доступное для редактирования состояние элемента интерфейса пользователя автоматически на основе выбора контроллера. Для полного списка всех доступных параметров привязки посмотрите Ссылку Привязки Какао.
Расширение шаблона разработки MVC
Архитектура привязки Какао расширяет традиционное Какао конфигурация MVC, где существует единственный изготовленный на заказ контроллер, управляющий пользовательским интерфейсом. Это обеспечивает ряд допускающих повторное использование классов контроллера, наследовавшихся от абстрактного суперкласса, NSController. В основанном на привязке приложении может быть несколько контроллеров — Ваше собственное (таких как подкласс NSWindowController, управляя пользовательским интерфейсом документа) и другие, которые являются подклассами NSController и управляют различными частями пользовательского интерфейса. Вы могли бы также создать свои собственные подклассы стандартных классов контроллера Набора Приложения — в частности Вы могли бы разделить NSArrayController на подклассы для настройки сортировки и фильтрации поведения.
Другие числа в этом документе представляют удобное сокращение. Несмотря на то, что экземпляр NSController концептуально связывается непосредственно с его объектом модели в большинстве ситуаций, привязка будет «косвенной», к переменной в Вашем объекте документа, как показано на рисунке 6.
Supporting Technologies
Привязка какао полагается прежде всего на две других технологии, кодирование значения ключа (KVC) и наблюдение значения ключа (KVO). Сама привязка установлена с помощью привязки значения ключа (KVB), как проиллюстрировано на рисунке 7. На практике обычно необходимо понимать эти технологии, только если Вы хотите создать свое собственное представление с привязкой. Если Вы хотите использовать привязку, единственное требование, наложенное на Вас, - то, что Ваши классы модели должны быть совместимыми с соглашениями кодирования значения ключа для любых свойств, с которыми Вы хотите связать.
Привязка значения ключа
Привязка установлена с a bind:toObject:withKeyPath:options:
сообщение, говорящее получателю сохранять свой указанный атрибут, синхронизировалось — по модулю опции — со значением свойства, идентифицированного ключевым путем указанного объекта. Получатель должен наблюдать за соответствующими изменениями в объекте, с которым он связывается, и реагируйте на те изменения. Получатель должен также сообщить объекту изменений в связанном атрибуте. После того, как привязка установлена существует поэтому два аспекта к хранению модели, и представления синхронизировались: ответ на взаимодействие с пользователем с представлениями и реакцией на изменения в значениях модели.
В инициируемом в представление обновлении значение, измененное в пользовательском интерфейсе, передается контроллеру, поочередно продвигающему новое значение на модель. Для сохранения абстракции, требуемой позволить этому работать с любым контроллером или объектом модели, система использует общий протокол доступа — кодирование значения ключа.
В инициируемом в модель обновлении модели уведомляют контроллеры, и контроллеры уведомляют представления изменений в значениях, в которых интерес был зарегистрирован с помощью общего протокола — наблюдение значения ключа. Обратите внимание на то, что инициируемое в модель обновление может быть инициировано непосредственным управлением моделью — например, событием Scripted Apple — или как результат инициируемого в представление обновления — изменение в температуре, сделанной путем редактирования поля Celsius, должно быть распространено назад к ползунку.
Кодирование значения ключа
Кодирование значения ключа является механизмом, посредством чего можно получить доступ к свойству в объекте с помощью имени свойства в качестве строки — «ключ». Можно также использовать ключевые пути для следования за отношениями между объектами. Например, учитывая класс Сотрудника с атрибутом firstName
, Вы могли получить имя сотрудника с помощью кодирования значения ключа с ключом firstName
. Если у Сотрудника есть отношение, названное «менеджером» другому Сотруднику, Вы могли бы получить имя менеджера сотрудника с помощью кодирования значения ключа с ключевым путем manager.firstName
. Для получения дополнительной информации посмотрите, что Значение ключа Кодирует Руководство по программированию.
Вспомните, что привязка указывает ключевой путь к свойству, с которым связывается данный атрибут. Если значение в ползунке или текстовом поле изменяется, это использует кодирование значения ключа — использование ключевого пути, указанного привязкой как ключ — для передачи того изменения непосредственно в контроллере, как проиллюстрировано на рисунке 8. Обратите внимание на то, что стрелки в этом числе представляют направление, в котором сообщения отправляются и в который информационные потоки. Новое значение передается с виджета пользовательского интерфейса на контроллер, и от контроллера до модели.
Наблюдение значения ключа
Наблюдение значения ключа является механизмом, посредством чего объект может зарегистрироваться в другом, чтобы быть уведомленным относительно изменений в значении свойства. Когда один объект связывается с другим объектом, он регистрирует себя как наблюдатель соответствующего свойства того объекта. В текущем примере текстовое поле и ползунок регистрируются как наблюдатели температурного свойства содержания контроллера, как проиллюстрировано на рисунке 9.
Обратите внимание на то, что стрелки, показанные на рисунке 9, указывают на направление наблюдения, не потока данных. Наблюдение является «пассивным» процессом (сродни регистрации для получения уведомлений из NSNotificationCenter). Когда значение изменяется, наблюдаемый объект отправляет сообщение заинтересованным наблюдателям для уведомления их, как проиллюстрировано на рисунке 10. Стрелки на рисунке 10 показывают направление, в котором отправляются сообщения.
Почему NSControllers полезный?
Привязка может, в принципе, быть сделана между почти любыми двумя объектами, при условии, что они KVC-совместимы и KVO-совместимы. Представление могло связать непосредственно с объектом модели. Основанные на привязке приложения, однако, контроллер использования возражает, чтобы управлять отдельными объектами модели и наборами объектов модели и взаимодействовать через интерфейс к системе пользовательских настроек.
Возможно сделать привязку непосредственно к Вашим объектам модели или к контроллерам, не наследовавшимся от NSController —, однако, Вы проигрываете (или должен повторно реализовать), функциональность, предоставленная объектами контроллера Набора Приложения.
Экземпляры NSController управляют своим текущим выбором и значениями заполнителя. Это позволяет представлению отображать надлежащее значение, если выбор контроллера является нулем, или если существует множественный выбор.
NSController (и элементы пользовательского интерфейса Набора Приложения, поддерживающие привязку) реализует протоколы NSEditorRegistration и NSEditor. Протокол NSEditorRegistration предоставляет средние значения редактору (представление) для информирования контроллера, когда он отменил фиксацию изменений. Протокол NSEditor обеспечивает средние значения для запроса, чтобы фиксация получателя или отбросила любые незаконченные редактирования.
Например, если пользователь вводит в текстовом поле и затем нажимает кнопку, контроллер гарантирует, что объект модели обновляется с полным содержанием текстового поля, прежде чем действие кнопки будет иметь место.
Несмотря на то, что методы обычно вызываются на элементы пользовательского интерфейса контроллером, они могут также быть отправлены в контроллер, например в ответ на попытку пользователя сохранить документ или выйти из приложения.
Классы NSController
NSController является абстрактным классом. Его конкретными подклассами является NSObjectController, NSUserDefaultsController, NSArrayController и NSTreeController. NSObjectController управляет отдельным объектом и обеспечивает функциональность, обсужденную до сих пор. NSUserDefaultsController обеспечивает удобный интерфейс для предпочтительной системы.
NSArrayController и NSTreeController управляют наборами объектов модели и отслеживают текущий выбор. Контроллеры набора также позволяют Вам добавлять объекты к и удалять объекты из, набор содержания. Объекты, которыми управляют контроллеры набора, не должны даже быть в массиве — Ваш контейнер может реализовать подходящие методы (“индексированное средство доступа” методы, определенные в протоколе NSKeyValueCoding) для представления значений контроллеру, как будто они были в массиве.
Что можно связать?
Можно сделать привязку для большинства классов представления Application Kit, таких как NSButton и NSTableView. Используя контроллер массива, например, можно связать содержание всплывающего меню к объектам в массиве. Остаток от этой статьи представляет пример, который умеренно сложен. Несмотря на то, что подробные данные преднамеренно оставляют неопределенными, это, тем не менее, служит для иллюстрирования ряда вопросов и обеспечивает примеры более сложной привязки.
Реальный пример
Рассмотрите игровое заявление, в котором пользователь управляет многими воюющими сторонами, из которых они могут выбрать тот как атакующий. Воюющая сторона может перенести три оружия, одно из которого выбрано в любое время. В приложении список воюющих сторон показан в табличном представлении, заголовок окна показывает имя атакующего, и всплывающее меню показывает в настоящее время выбираемое оружие, как показано на рисунке 11.
Воюющие стороны представлены экземплярами Боевого класса. В Боевом классе на каждое оружие ссылаются как отдельная переменная экземпляра, как показано на рисунке 12. Путем реализации подходящих «индексируемых» методов доступа (определенный протоколом кодирования значения ключа), однако, Боевой класс может позволить контроллеру массива получать доступ к оружию, как будто они были в массиве.
Когда пользователь выбирает атакующего из табличного представления, заголовок окна обновляется для отражения имени атакующего, и заголовок всплывающего меню обновляется для отражения выбранного оружия атакующего. Когда пользователь активирует раскрывающееся, его содержание создается динамично из набора оружия, которое переносит воюющая сторона. Когда пользователь выбирает пункт меню, выбранное оружие воюющей стороны установлено в то соответствие тому пункту меню. Если различный атакующий выбран, раскрывающееся, выбор и обновление заголовка окна соответственно.
Рисунок 13 иллюстрирует, как пользовательский интерфейс Боевого приложения может быть реализован с помощью привязки. Табличное представление связывается с контроллером массива, управляющим массивом воюющих сторон. Заголовок окна связывается с именем выбранной воюющей стороны. Всплывающее меню получает свой список элементов от контроллера массива, связанного с оружием атакующего «массив», и его выбор связывается с выбранным оружием атакующего.
Этот пример иллюстрирует ряд вопросов:
В приложении можно использовать больше чем один объект контроллера.
Различные аспекты элемента пользовательского интерфейса могут быть связаны с различными контроллерами.
Можно использовать собственные классы модели.
Наконец, нужно подчеркнуть, что пример требует, чтобы никакой фактический код не установил пользовательский интерфейс — контроллеры и привязка могут все быть созданы в Интерфейсном Разработчике. Это представляет значительное сокращение работы по программированию по сравнению с традиционным целевым действием базируемый подход.