Текстовая системная организация

Текстовая система Какао абстрагирована в ряд классов, взаимодействующих для обеспечения всех обрабатывающих текст функций системы. Классы представляют определенные функциональные области с четко определенными интерфейсами, позволяющими прикладным программам изменить поведение системы, или даже заменять расстается с пользовательскими подклассами. Текстовая система Какао разработана так, чтобы Вы не должны были узнавать об или взаимодействовать с большим количеством системы, чем необходимо для удовлетворения потребностей приложения.

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

При необходимости в более гибком, программируемом доступе к тексту необходимо будет узнать об уровне хранения и NSTextStorage класс. И, конечно, для получения доступ ко всем доступным функциям можно взаимодействовать с любым из классов, поддерживающих текстовую систему.

Функциональные области текстовой системы какао

Рисунок 3-1 показывает главные функциональные области текстовой системы с уровнем пользовательского интерфейса на вершине, уровнем хранения на нижней части, и, в средней области, компоненты, размечающие текст для дисплея. Эти уровни представляют представление, контроллер и понятия модели, соответственно, как описано в MVC и текстовой Системе.

Рисунок 3-1  Главные функциональные области текстовой системы Какао
Major functional areas of the Cocoa text system

Текстовые классы превышают большинство других классов в AppKit в богатстве и сложности их интерфейса. Одна из их целей проекта состоит в том, чтобы обеспечить исчерпывающий набор обрабатывающих текст функций так, чтобы Вы редко создавали подкласс. Среди прочего, текстовый объект такой как NSTextView может:

Инструменты разработки графического интерфейса пользователя (такие как Интерфейсный Разработчик) могут предоставить Вам доступ к текстовым объектам в нескольких различных конфигурациях, таких как найденные в NSTextField, NSForm, и NSScrollView объекты. Эти классы конфигурируют текстовый объект в своих собственных определенных целях. Кроме того, все NSTextField, NSForm, или NSButton объекты в том же окне — короче говоря, все объекты, получающие доступ к текстовому объекту через связанные ячейки — совместно используют тот же текстовый объект, названный полевым редактором. Таким образом обычно лучше использовать один из этих классов каждый раз, когда это удовлетворяет Ваши потребности, вместо того, чтобы создать текстовые объекты самостоятельно. Но если один из этих классов не обеспечивает достаточно гибкости в Ваших целях, можно создать текстовые объекты программно.

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

К расположению органов управления текста на экране или распечатанной странице, Вы работаете с объектами, соединяющимися NSTextStorage репозиторий к NSTextView это выводит на экран его содержание. Эти объекты имеют NSLayoutManager и NSTextContainer классы.

NSTextContainer объект определяет область, где может быть размечен текст. Как правило, текстовый контейнер определяет прямоугольную область, но путем создания подкласса NSTextContainer можно создать другие формы: круги, пятиугольники или неправильные формы, например. NSTextContainer не объект пользовательского интерфейса, таким образом, он ничего не может вывести на экран или получить события от клавиатуры или мыши. Это просто описывает область, которая может быть заполнена текстом, и это не связывается ни к какой определенной системе координат. Ни делает NSTextContainer текст объектно-ориентированной памяти — это - задание NSTextStorage объект.

Менеджер по расположению объект, NSLayoutManager класс, организует работу другого текста, обрабатывающего объекты. Это ходатайствует в операциях, преобразовывающих данные в NSTextStorage возразите против представленного текста в NSTextView дисплей объекта. Это также наблюдает за расположением текста в областях, определенных NSTextContainer объекты.

Иерархия классов текстовой системы какао

В дополнение к четырем основным классам в текстовой системе —NSTextStorage, NSLayoutManager, NSTextContainer, NSTextView— существует много вспомогательных классов и протоколов. Рисунок 3-2 обеспечивает более полное изображение текстовой системы. Имена между угловыми скобками, такой как <NSCopying>, протоколы.

  Текстовая системная иерархия классов какао рисунка 3-2
Class Hierarchy of the Cocoa Text SystemClass Hierarchy of the Cocoa Text System

MVC и текстовая система

Текстовая архитектура системы Какао является и модульной и многоуровневой для улучшения ее простоты использования и гибкости. Его модульная конструкция отражает парадигму Контроллера представления Модели (происходящий с Smalltalk-80), где данные, его визуальное представление и логика, соединяющая эти два, представлены отдельными объектами. В случае текстовой системы, NSTextStorage содержит текстовые данные модели, NSTextContainer моделирует геометрию области расположения, NSTextView представляет представление, и NSLayoutManager ходатайствует как контроллер, чтобы удостовериться, что данные и его представление на экране остаются в соглашении.

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

Разделение на уровни текстовой системы сокращает сумму, необходимо учиться выполнять общие обрабатывающие текст задачи. Фактически, много приложений взаимодействуют с системой исключительно через API NSTextView класс.

Создание текстовых системных объектов

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

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

Вы создаете и поддерживаете ссылку на NSTextView объект, автоматически создающий, соединяет и владеет другими текстовыми системными объектами. Большинство приложений Какао использует этот метод и взаимодействует с текстовой системой на высоком уровне через NSTextView. Можно создать текстовое представление и иметь его, создают другого Разработчика Интерфейса использования текстовых объектов, редактора графического интерфейса XCode, или можно сделать ту же вещь программно.

Для создания текстового объекта представления в Интерфейсном Разработчике перетащите текстовое Представление от Библиотеки объектов на окно приложения. Когда Ваши запуски приложения и его файл пера загружаются, это инстанцирует NSTextView возразите и встраивает его в представление прокрутки. Негласно, текстовый объект представления автоматически инстанцирует и управляет NSTextContainer, NSLayoutManager, и NSTextStorage объекты.

Для создания текстового представления возражают программно и позволяют ему создать и владеть другими объектами, использовать NSTextView метод инициализации initWithFrame:.

Текстовый метод владения представления является самым простым и самым чистым способом установить текстовую сеть системного объекта. Однако это создает единственный поток текста, не поддерживающего разбиение на страницы или сложные макеты, как описано в общих Конфигурациях. Для других конфигураций необходимо создать объекты явно.

Ваше приложение создает объекты явно

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

Чтобы создать текстовые системные объекты явно и соединить их вместе, используйте шаги, показанные в этом разделе. Этот код мог находиться в реализации applicationDidFinishLaunching: метод уведомления делегата приложения, например. Это принимает это textStorage переменная экземпляра объекта делегата. Это также принимает это window и windowView свойства делегата приложения, представляющего выходы главному окну приложения и довольному представление.

  1. Создайте NSTextStorage объект в нормальном способе использовать alloc и init… сообщения.

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

    textStorage = [[NSTextStorage alloc]
                  initWithString:@"Here's to the ones who see things different."];
  2. Создайте NSLayoutManager объект и подключение это к текстовому объекту хранения.

    Менеджеру по расположению нужны много объектов поддержки — таких как те, которые помогают ему генерировать глифы или текст позиции в текстовом контейнере — для его работы. Это автоматически создает эти объекты (или соединяется с существующими) на инициализацию.

    NSLayoutManager *layoutManager;
    layoutManager = [[NSLayoutManager alloc] init];
    [textStorage addLayoutManager:layoutManager];
  3. Создайте NSTextContainer возразите, инициализируйте его с размером и подключите его к менеджеру по расположению.

    Размер текстового контейнера является размером представления, в котором это выведено на экран — в этом случае self.windowView представление содержания главного окна приложения. Как только Вы создали текстовый контейнер, Вы добавляете его к списку контейнеров, которыми владеет менеджер по расположению. Если Ваше приложение имеет многократные текстовые контейнеры, можно создать их и добавить их на этом шаге, или можно создать их лениво по мере необходимости.

    NSTextContainer *textContainer;
    textContainer = [[NSTextContainer alloc]
                    initWithContainerSize:self.windowView.frame.size];
    [layoutManager addTextContainer:textContainer];
  4. Создайте NSTextView возразите, инициализируйте его с кадром и подключите его к текстовому контейнеру.

    При создании текстовой сети объекта системы явно необходимо использовать initWithFrame:textContainer: метод для инициализации текстового представления. Этот метод инициализации делает не что иное как инициализирует получатель и устанавливает его текстовый контейнер (в отличие от этого initWithFrame:, который не только инициализирует получатель, но и автоматически создает и соединяет его собственную сеть текстовых системных объектов). Каждое текстовое представление в системе подключено к ее собственному текстовому контейнеру.

    NSTextView *textView;
    textView = [[NSTextView alloc]
               initWithFrame:self.windowView.frame
               textContainer:textContainer];

    Один раз NSTextView объект был инициализирован, Вы делаете его представлением содержания тогда выведенного на экран окна. makeFirstResponder: сообщение делает текстовый ключ представления, так, чтобы это приняло события нажатия клавиши.

    [self.window setContentView:textView];
    [self.window makeKeyAndOrderFront:nil];
    [self.window makeFirstResponder:textView];

    Для простоты этот код помещает текстовое представление непосредственно в представление содержания окна. Более обычно текстовые представления помещаются в представлениях прокрутки, как описано в Помещении Объекта NSTextView в NSScrollView.

Общие конфигурации

Следующие схемы дают Вам общее представление о том, как можно сконфигурировать объекты четырех основных текстовых системных классов —NSTextStorage, NSLayoutManager, NSTextContainer, и NSTextView— достигать различные обрабатывающие текст цели.

Для отображения единственного потока текста расположите объекты как показано на рисунке 3-3.

  Конфигурация Текстового объекта рисунка 3-3 для единственного потока текста
Text object configuration for a single flow of text

NSTextView объект обеспечивает представление, выводящее на экран глифы, и NSTextContainer объект определяет область в том представлении, где размечаются глифы. Обычно в этой конфигурации, NSTextContainer измерение по вертикали объекта, как объявляют, является некоторым чрезвычайно большим значением так, чтобы контейнер мог разместить любую сумму текста, в то время как NSTextView объект установлен измерить себя вокруг текста с помощью setVerticallyResizable: метод, определенный NSText, и учитывая максимальную высоту равняются NSTextContainer высота объекта. Затем с текстовым представлением, встроенным в NSScrollView объект, пользователь может прокрутить для наблюдения любой части этого текста.

Если текстовая область контейнера вставляется от текстовых границ представления, поле появляется вокруг текста. NSLayoutManager объект и другие объекты, не изображенные здесь, сотрудничают для генерации глифов от NSTextStorage данные объекта и размечают их в области, определенной NSTextContainer объект.

Эта конфигурация ограничивается при наличии только одного NSTextContainer-NSTextView пара. В таком расположении, текстовые потоки, непрерывные в области, определенной NSTextContainer. Разрывы страницы, многостолбцовое расположение и более сложные макеты не могут быть размещены этим расположением.

При помощи кратного числа NSTextContainer-NSTextView пары, расположения более сложного макета возможны. Например, к повреждениям страницы поддержки, приложение может сконфигурировать текстовые объекты как показано на рисунке 3-4.

  Конфигурация Текстового объекта рисунка 3-4 для разбитого на страницы текста
Text object configuration for paginated textText object configuration for paginated text

Каждый NSTextContainer-NSTextView пара соответствует странице документа. Синий прямоугольник на рисунке 3-4 представляет пользовательский объект представления, который Ваше приложение обеспечивает как фон для NSTextView объекты. Это пользовательское представление может быть встроено в NSScrollView объект позволить пользователю просмотреть страницы документа путем прокрутки.

Многостолбцовый документ использует подобную конфигурацию, как показано на рисунке 3-5.

  Конфигурация Текстового объекта рисунка 3-5 для многостолбцового документа
Text object configuration for a multicolumn document

Вместо того, чтобы иметь тот NSTextView-NSTextContainer пара соответствует единственной странице, существует теперь две пары — один для каждого столбца на странице. Каждый NSTextContainer-NSTextView пара управляет частью документа. Поскольку текст выведен на экран, глифы сначала размечаются в верхнем левом представлении. Когда больше нет комнаты в том представлении, NSLayoutManager объект сообщает своему делегату, что закончил заполнять контейнер. Делегат может проверить, существует ли больше текста, который должен быть размечен и добавить другого NSTextContainer и NSTextView при необходимости. NSLayoutManager возразите доходам для разметки текста в следующем контейнере, уведомляет делегата по окончании, и т.д. Снова, пользовательское представление (изображенный как синий прямоугольник) обеспечивает холст для этих столбцов текста.

Мало того, что Вы можете иметь многократный NSTextContainer-NSTextView пары, Вы можете также иметь многократный NSLayoutManager объекты, получающие доступ к тому же текстовому хранению. Рисунок 3-6 иллюстрирует самое простое расположение с многократными менеджерами по расположению.

  Конфигурация Текстового объекта рисунка 3-6 для многократных представлений того же текста
Text object configuration for multiple views of the same textText object configuration for multiple views of the same text

Эффект этого расположения состоит в том, чтобы высказать многократные мнения по тому же тексту. Если пользователь изменяет текст в виде сверху, изменение сразу отражается в виде снизу (предполагающий, что расположение изменения в границах вида снизу).

Наконец, сложные требования макета страницы, такие как разрешение текста перенести встроенную графику, могут быть достигнуты конфигурацией, использующей пользовательский подкласс NSTextContainer. Этот подкласс определяет область, адаптирующую ее форму для размещения графического изображения и использующую конфигурацию объекта, показанную на рисунке 3-7.

  Конфигурация Текстового объекта рисунка 3-7 с контейнерами пользовательского текста
Text object configuration with custom text containers

См. текстовое Руководство по программированию Расположения для получения информации о том, как текстовая система размечает текст.