Как работают маркерные поля

Маркерные полевые работы над предпосылкой конечного набора объектов как потенциальное содержание. Эти объекты могут быть NSString объекты или объекты любого другого типа. Объекты, которые не являются строками, требуют строки дисплея.

Маркеры и представленные объекты

Даже если тот объект является просто строкой, используемой для метки, в некотором смысле маркер является маркированным представленным объектом. Представленный объект является объектом, произвольно связанным с ячейкой или пунктом меню. Маркерное поле — более точно, NSTokenFieldCell компонент маркерного поля — наследовал функцию представленных объектов от NSCell. Но реализация расширяет понятие представленного объекта заставить его примениться ко всем маркерам в поле.

Как пример, рассмотрите маркерное поле, в котором пользователи вводят имена людей в их Адресной книге. Маркерное поле реализовано так, чтобы каждое маркерное поле имело представленный объект типа ABPerson (класс в платформе Адресной книги).

Вы не обязаны присваивать представленный объект каждому маркеру в маркерном поле. В этом случае представленный объект маркера является строкой, которую он выводит на экран.

Для получения дополнительной информации на представленных объектах, см. “Представленные Объекты» в Темах Программирования Управления и Ячейки.

Объектное значение маркерных полей

Когда Вы хотите получить содержание маркерного поля, Вы отправляете его objectValue сообщение. Это сообщение возвращает массив представленных объектов поля, являются ли те объекты строками или чем-то еще. С другой стороны можно установить содержание маркерного поля путем отправки ему a setObjectValue: сообщение, передающее в массиве представленных объектов, Вы хотите, чтобы поле имело. Если эти объекты не являются строками, маркерное поле запрашивает своего делегата к строкам для отображения для представленных объектов.

Поскольку маркерное поле является прямым потомком NSTextField, это - управление, отправляющее сообщение действия в его цель, когда пользователь нажимает клавишу Return (или если точка вставки покидает поле, если действие сконфигурировано, поскольку “Отправляют на Редактировании конца”). Нажатие клавиши Return или маркирует последний раз вводимую строку или заставляет сообщение действия быть отправленным. Ваша реализация метода действия является идеальным местом для выяснения у маркерного поля (sender) для его объектного значения.

Основное взаимодействие с делегатом

Для получения возможностей списков завершения, представлял объекты и маркерные меню для маркерных полей, необходимо реализовать много методов делегации. Маркерное поле отправляет ряд сообщений его делегату, как проиллюстрировано на рисунке 2-1.

Рисунок 2-1  обменивается сообщениями маркерному полевому делегату
Messages to the token field delegate
  1. Пользователь вводит текст в маркерном поле.

  2. Делегат получает tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem: обменивайтесь сообщениями и возвращает список возможных завершений для переданного - в подстроке.

    Делегат продолжает получать это сообщение, как пользователь продолжает вводить в маркерном поле; каждый раз это возвращает прогрессивно сужаемый список возможных завершений.

  3. Пользователь выбирает строку из списка завершения и вводит символ маркирования.

    Пользователь мог ввести строку, которая не находится в списке возможных завершений, и это также маркируется.

  4. Делегат получает tokenField:representedObjectForEditingString: обменивайтесь сообщениями и возвращает представленный объект, соответствующий переданному - в редактировании строки.

    Если делегат не реализует это сообщение или возвраты nil, вводимая строка является представленным объектом.

  5. Если делегат реализует tokenField:representedObjectForEditingString: метод для возврата представленного объекта для вводимой строки это затем получает tokenField:displayStringForRepresentedObject: сообщение. Делегат реализует этот метод для возврата строки дисплея для данного представленного объекта. (Эта строка дисплея может отличаться от строки, вводимой из списка завершения.)

  6. Маркер запрашивает делегата с tokenField:hasMenuForRepresentedObject: узнать, имеет ли маркер меню. Если существует меню, оно добавляет треугольную кнопку открытия, когда оно рисует маркер.

  7. Пользователь нажимает кнопку открытия меню маркера.

  8. Делегат получает tokenField:menuForRepresentedObject: обменивайтесь сообщениями и возвращается NSMenu объект (содержащий желаемые пункты меню) к маркерному полю, выводящему на экран меню.

Существует несколько других методов, включая которые маркерное поле отправляет его делегату, tokenField:styleForRepresentedObject:, который позволяет замену маркеров простого текста для вида инкапсуляции.