Копия, сокращение и операции вставки

Пользователи могут скопировать текст, изображения или другие данные в одном приложении и вставить те данные к другому расположению в том же приложении или в различном приложении. Можно, например, скопировать адрес лица в электронном письме и вставить его в надлежащее поле в приложении Контактов. Платформа UIKit реализует вставку сокращения копии в UITextView, UITextField, и UIWebView классы. Если Вы хотите это поведение в своих собственных приложениях, можно или использовать объекты этих классов или реализовать вставку сокращения копии сами.

Следующие разделы описывают программируемые интерфейсы UIKit, который Вы используете для копии, сокращаете, и операции вставки и объясняете, как они используются.

Операции вставки копии в UIKit

Несколько классов и неофициальный протокол платформы UIKit дают Вам методы и механизмы, необходимо реализовать копию, сократить, и операции вставки в приложении:

Понятия области монтажа

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

В iOS область монтажа также используется для поддержки операций Find. Кроме того, можно использовать области монтажа для передачи данных между приложениями с помощью пользовательских схем URL вместо копии, сократить и вставить команды; посмотрите Обновление Ваших Настроек Info.plist для получения информации об этом методе.

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

Названные области монтажа

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

  • UIPasteboardNameGeneral для сокращения, копии и операций вставки, включающих широкий диапазон типов данных. Можно получить одноэлементный объект представление Общей области монтажа путем вызова generalPasteboard метод класса.

  • UIPasteboardNameFind для поисковых операций. Строка, в настоящее время вводимая пользователем в панели поиска (UISearchBar) записан в эту область монтажа, и таким образом может быть совместно использован приложениями. Можно получить объект, представляющий область монтажа Находки путем вызова pasteboardWithName:create: метод класса, передача в UIPasteboardNameFind для имени.

Если необходимый можно создать собственное использование области монтажа приложения, обычно Вы используете одну из определенных с помощью системы областей монтажа, но pasteboardWithName:create: Если Вы вызываете pasteboardWithUniqueName, UIPasteboard дает Вам область монтажа уникально-указанного-приложения. Можно обнаружить имя области монтажа через имя свойство.

Персистентность области монтажа

Области монтажа могут быть персистентными. Когда область монтажа является персистентной, она продолжает существовать мимо завершений приложения и через системные перезагрузки. Системные области монтажа являются персистентными. Несмотря на то, что области монтажа приложения по умолчанию не являются персистентными, приложение может отметить их как персистентных путем установки persistent свойство к YES. Области монтажа приложения, которые не являются персистентными только в последний раз до владения (создающего) выходы приложения. Персистентная область монтажа приложения удалена, когда удаляется приложение, создавшее ее.

Владелец области монтажа и элементы

Объект, которые длятся помещенные данные на область монтажа, упоминается как владелец области монтажа. Каждую часть данных, помещенных на область монтажа, считают элементом области монтажа. Область монтажа может содержать единственные или многократные элементы. Приложения могут поместить или получить столько элементов, сколько они желают. Например, скажите, что пользовательский выбор в представлении содержит и текст и изображение. Область монтажа позволяет Вам скопировать текст и изображение к области монтажа как отдельные элементы. Приложение, читая многократные элементы из области монтажа может принять решение взять только те элементы, которые оно поддерживает (текст, но не изображение, например).

Представления и UTIs

Операции области монтажа часто выполняются между двумя различными приложениями. Никакое приложение не требуется, чтобы знать о другом, включая виды данных, которые оно может обработать. Для максимизации потенциала для совместного использования область монтажа может содержать многократные представления того же элемента области монтажа. Например, визуальный редактор мог бы обеспечить HTML, PDF и представления простого текста скопированных данных. Элемент на области монтажа включает все представления того элемента данных, который может обеспечить приложение.

Каждое представление элемента области монтажа обычно идентифицируется Unique Type Identifier (UTI). (UTI является просто строкой, однозначно определяющей определенный тип данных.) UTI обеспечивает общие средние значения для идентификации типов данных. Если у Вас есть пользовательский тип данных, Вы хотите поддерживать, необходимо создать уникальный идентификатор для него. Для этого Вы могли использовать нотацию обратного DNS для своей строки типа представления для обеспечения уникальности; например, пользовательский тип представления мог быть com.myCompany.myApp.myType. Для получения дополнительной информации о UTIs см. Универсальный Обзор Идентификаторов типов.

Например, предположите, что приложение поддерживало выбор обогащенного текста и изображений. Это может хотеть поместить в область монтажа и обогащенный текст и версии Unicode текстового выбора и различные представления выбора изображения. Каждое представление каждого элемента сохранено его собственными данными, как показано на рисунке 6-1.

  Элементы Области монтажа рисунка 6-1 и представления
Pasteboard items and representations

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

Читатель области монтажа должен найти тип данных что лучшие иски его возможности (если таковые имеются). Как правило, это означает выбирать самый богатый доступный тип. Например, текстовый редактор мог бы обеспечить HTML (обогащенный текст) и представления простого текста данных скопированного текста. Приложение, поддерживающее обогащенный текст, должно получить представление HTML и приложение, только поддерживающее простой текст, должен получить версию простого текста.

Количество изменения

Количество изменения является переменной на область монтажа, постепенно увеличивающей каждый раз содержание изменений области монтажа — в частности, когда элементы добавлены, изменены или удалены. Путем исследования количества изменения (через changeCount свойство), приложение может определить, совпадают ли текущие данные в области монтажа с данными, которые это в последний раз получило. Каждый раз, когда количество изменения постепенно увеличивается, область монтажа отправляет уведомление заинтересованным наблюдателям.

Первые шаги: идентифицируйте выбор и выведите на экран меню редактирования

Если Вы собираетесь скопировать, сократить или вставить что-то, сначала необходимо выбрать его. (Операция вставки часто управляет на пустом выборе таким каре, указывая позицию в наборе элементов.) После выбора элемента — и визуально указания выбора — необходимо вывести на экран меню редактирования. Меню редактирования является системным меню, которое может потенциально иметь следующие команды в нем: Копия, Сокращение, Вставка, Выбор и Выбор Все. Меню редактирования указывает на выбор. Когда пользователь касается пункта меню, надлежащего UIResponderStandardEditActions реализация метода (такой как cut: или paste:) вызывается.

Для больше о выборах и изучить, как вывести на экран и управлять меню редактирования, посмотрите Управление Выбором и Меню Редактирования.

Копирование и сокращение выбора

Когда пользователи касаются команды Copy или Cut меню редактирования, система вызывает copy: или cut: метод (соответственно) респондента возражает, что реализует его. Обычно первый респондент — Ваше пользовательское представление — реализует эти методы, но если первый респондент не реализует их, перемещения сообщения цепочка респондента обычным способом. Обратите внимание на то, что UIResponderStandardEditActions неофициальный протокол объявляет эти методы.

В ответ на a copy: или cut: сообщение, Вы пишете объект или данные, представленные выбором области монтажа в стольких различных представлениях, сколько Вы можете. Эта работа включает следующие шаги (которые принимают единственный элемент области монтажа):

  1. От выбора идентифицируйте или получите объект или двоичных данных, соответствующих объекту.

    Двоичные данные должны инкапсулироваться в NSData объект. Если Вы собираетесь записать другой тип объекта к области монтажа, это должен быть объект списка свойств — т.е. объект одного из следующих классов: NSString, NSArray, NSDictionary, NSDate, NSNumber, или NSURL. (Для больше на объектах списка свойств, см. Руководство по программированию Списка свойств.)

  2. Если возможно, генерируйте одно или более других представлений объекта или данных.

    Например, если на предыдущем шаге Вы создали a UIImage объект, представляющий выбранное изображение, Вы могли использовать UIImageJPEGRepresentation и UIImagePNGRepresentation функции для преобразования изображения в различное представление.

  3. Получите объект области монтажа.

    Во многих случаях это - общая область монтажа, через которую можно пройти generalPasteboard метод класса.

  4. Присвойте подходящий UTI для каждого представления данных, записанных в элемент области монтажа.

    Посмотрите Понятия Области монтажа для обсуждения этого предмета.

  5. Запишите данные в первый элемент области монтажа для каждого типа представления:

    • Для записи объекта данных отправьте a setData:forPasteboardType: обменивайтесь сообщениями к объекту области монтажа.

    • Для записи объекта списка свойств отправьте a setValue:forPasteboardType: обменивайтесь сообщениями к объекту области монтажа.

  6. Если команда Сокращается (cut: метод), удалите объект, представленный выбором от модели данных приложения, и обновите свое представление.

Перечисление 6-1 показывает реализации copy: и cut: методы. cut: метод вызывает copy: метод и затем удаляет выбранный объект из представления и модели данных. Обратите внимание на то, что copy: метод архивирует пользовательский объект для получения NSData возразите, что это может передать области монтажа в setData:forPasteboardType:.

Перечисление 6-1  , Копирующее и сокращающее операции

- (void)copy:(id)sender {
    UIPasteboard *gpBoard = [UIPasteboard generalPasteboard];
    ColorTile *theTile = [self colorTileForOrigin:currentSelection];
    if (theTile) {
        NSData *tileData = [NSKeyedArchiver archivedDataWithRootObject:theTile];
        if (tileData)
            [gpBoard setData:tileData forPasteboardType:ColorTileUTI];
    }
}
 
- (void)cut:(id)sender {
    [self copy:sender];
    ColorTile *theTile = [self colorTileForOrigin:currentSelection];
 
    if (theTile) {
        CGPoint tilePoint = theTile.tileOrigin;
        [tiles removeObject:theTile];
        CGRect tileRect = [self rectFromOrigin:tilePoint inset:TILE_INSET];
        [self setNeedsDisplayInRect:tileRect];
     }
}

Вставка выбора

Когда пользователи касаются команды Paste меню редактирования, система вызывает paste: метод респондента возражает, что реализует его. Обычно первый респондент — Ваше пользовательское представление — реализует этот метод, но если первый респондент не реализует его, перемещение сообщения респондент обычным способом. paste: метод объявляется UIResponderStandardEditActions неофициальный протокол.

В ответ на a paste: сообщение, Вы читаете объект из области монтажа в представлении что Ваши поддержки приложений. Тогда Вы добавляете вставленный объект к модели данных приложения и выводите на экран новый объект в представлении в обозначенном пользователями расположении. Эта работа включает следующие шаги (которые принимают единственный элемент области монтажа):

  1. Получите объект области монтажа.

    Во многих случаях это - общая область монтажа, через которую можно пройти generalPasteboard метод класса.

  2. Проверьте, что первый элемент области монтажа содержит данные в представлении, которое Ваше приложение может обработать путем вызова containsPasteboardTypes: метод или pasteboardTypes метод и затем исследование возвращенного массива типов.

    Обратите внимание на то, что необходимо было уже выполнить этот шаг в реализации canPerformAction:withSender:.

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

  4. Добавьте объект к модели данных приложения.

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

Перечисление 6-2 является примером реализации paste: метод. Это делает реверс объединенного cut: и copy: методы. Пользовательское представление увидело в первый раз, содержит ли общая область монтажа свое пользовательское представление данных; если это делает, это тогда считывает данные из области монтажа, добавляет это к модели данных приложения и отмечает часть себя — текущего выбора — для перерисовки.

Перечисление 6-2  , Вставляющее данные к выбору

- (void)paste:(id)sender {
    UIPasteboard *gpBoard = [UIPasteboard generalPasteboard];
    NSArray *pbType = [NSArray arrayWithObject:ColorTileUTI];
    ColorTile *theTile = [self colorTileForOrigin:currentSelection];
    if (theTile == nil && [gpBoard containsPasteboardTypes:pbType]) {
        NSData *tileData = [gpBoard dataForPasteboardType:ColorTileUTI];
        ColorTile *theTile = (ColorTile *)[NSKeyedUnarchiver unarchiveObjectWithData:tileData];
        if (theTile) {
            theTile.tileOrigin = self.currentSelection;
            [tiles addObject:theTile];
            CGRect tileRect = [self rectFromOrigin:currentSelection inset:TILE_INSET];
            [self setNeedsDisplayInRect:tileRect];
        }
    }
}

Окончание работы

Когда Ваша реализация cut:, copy: или paste: возвраты команды, меню редактирования автоматически скрыто. Если Вы хотите, можно программно сохранить его видимым. Для получения дополнительной информации посмотрите Отклонение Меню Редактирования