Tattoo салон в iPhone Luxor для iPhone
Авг 12

В этом уроке мы рассмотрим основы считывания из буфера обмена и записи в него.

Основы

Множественные буферы обмена

В iPhone не один системный буфер обмена, а несколько: общесистемный, применяющийся при операциях копирования–вставки, и буфер поиска, хранящий последнюю поисковую строку.

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

Множественные представления

Каждый добавляемый в буфер элемент относится к определенному типу. Если быть точнее, при добавлении элемента в буфер он получает представления одного или нескольких типов. Так, например, интернет-адрес может храниться и как цепочка символов, и как URL.

Хранение множественных представлений в буфере открывает широкие возможности использования соответствующих элементов. Клиент электронной почты будет работать текстовым представлением для добавления удобочитаемого представления URL-адреса в тело сообщения в виде “NSString“. Приложению с подкастами подойдёт представление NSURL.

Подобный подход применяется отнюдь не только в iPhone. Аналогичная методика при операции копирования в Safari дает открытый текст в TextMate и отформатированный — в Pages.

Операции с буфером

Обратите внимание: примеры в этом уроке задействуют общий буфер, поскольку все буферы являются подклассами класса “UIPasteboard“. Модель программирования применима к любому буферу.

Работа с общим буфером

Метод класса “generalPasteboard” возвращает ссылку на общий буфер — для наших примеров я настроил переменную буфера следующим образом:

1
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];

Свойства типа “convenience”

Самые распространённые операции с буфером — получение и настройка строк, изображений, URL-адресов и цветов. Для удобства Apple предоставляет специальные “conveniencegetter’ы/setter’ы в виде свойств.

1
2
3
4
5
6
NSString *string = pasteboard.string;
UIImage *image = pasteboard.image;
NSURL *url = pasteboard.URL;
UIColor *color = pasteboard.color;

pasteboard.string = @"paste me somewhere";

Определяем, имеется ли в наличии тип представления

Методы getter’ов возвращают ноль, если конкретный тип представления элемента отсутствует. Иногда узнать это лучше заранее. Для проверки воспользуйтесь методом “containsPasteboardTypes:

1
2
if ([pasteboard containsPasteboardTypes: [NSArray arrayWithObject:@"public.utf8-plain-text"]])
NSLog(@"String representation present: %@", pasteboard.string);

Для вывода списка со всеми типами элемента используйте “pasteboardTypes“.

Унифицированные идентификаторы типа — UTI — Описание типа

Описанный выше пример проверял тип “public.utf8-plain-text“, фиксируя наличие строки. Это и есть один из унифицированных идентификаторов (Uniform Type Identifier). Подробнее о них в оригинале можно прочесть в документации Apple.

Для самых распространённых типов у Apple есть отдельные константы в “UTCoreTypes.h“. Как их использовать:

1. Добавьте в проект фреймворк “MobileCoreServices
2. #import

Константы относятся к типу “CFStringRef“. Вы будете работать с ними как c “NSString“. Тип “CFStringRef” весьма удобен для представления строк как в C, так и в Objective-C. Для работы в Objective-C достаточно привести их к нужному виду:

1
NSString *urlUTIType = (NSString *)kUTTypeURL;

При желании создайте собственные — для своих типов данных. Apple рекомендует пользоваться для этой цели обеспечивающим единообразие стилем reverse-DNS (например, com.mobileorchard.mySnazzyType).

Настройка и извлечение типов в отсутствие getter’ов/setter’ов

Getter’ы/setter’ы типа “convenience” — не более чем синтаксические изыски. В принципе, функционально они не отличаются от методов “valueForPasteboardType:” и “setValue:forPasteboardType“.

1
2
NSString *string = [pasteboard valueForPasteboardType:@"public.utf8-plain-text"];
[pasteBoard setValue:@"paste me somewhere" forPasteboardType:@"public.utf8-plain-text"];

Данные методы предназначены для строк, массивов, словарей, дат, чисел и URL-адресов. Методы “dataForPasteboardType” и “setData:forPasteboardType:” доступны и для других типов.

Хранение элемента с множественными представлениями

У работы со вспомогательными setter’ами/свойствами есть существенное ограничение: элементы хранятся с одним типом. Если, как в приведенном выше примере, нам нужно сохранить URL-адрес как “NSString” и как “NSURL“, придется создать словарь типов и их значений, настроив свойства элементов буфера:

<<<врезка с кодом>>>

Теперь и “pasteboard.string“, и “pasteboard.url” будут возвращать элементы.

1
2
3
4
5
6
static NSString *string = @"http://www.mobileorchard.com";
NSDictionary *item = [NSDictionary dictionaryWithObjectsAndKeys:
string, @"public.utf8-plain-text", [NSURL URLWithString:string],
(NSString *)kUTTypeURL,
nil];
pasteboard.items = [NSArray arrayWithObject:item];

Поддержка буферами множественных элементов

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

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...


Оставьте комментарий