|
Авг
12
|
В этом уроке мы рассмотрим основы считывания из буфера обмена и записи в него.
Основы
Множественные буферы обмена
В iPhone не один системный буфер обмена, а несколько: общесистемный, применяющийся при операциях копирования–вставки, и буфер поиска, хранящий последнюю поисковую строку.
Кроме того, приложения могут создавать собственные буферы, доступные для использования другими приложениями. Так, например, у приложения по обработке данных из точек продажи и у приложения для терминала кредитных карт может быть общий буфер для обмена деталями платежей.
Множественные представления
Каждый добавляемый в буфер элемент относится к определенному типу. Если быть точнее, при добавлении элемента в буфер он получает представления одного или нескольких типов. Так, например, интернет-адрес может храниться и как цепочка символов, и как URL.
Хранение множественных представлений в буфере открывает широкие возможности использования соответствующих элементов. Клиент электронной почты будет работать текстовым представлением для добавления удобочитаемого представления URL-адреса в тело сообщения в виде “NSString“. Приложению с подкастами подойдёт представление NSURL.
Подобный подход применяется отнюдь не только в iPhone. Аналогичная методика при операции копирования в Safari дает открытый текст в TextMate и отформатированный — в Pages.
Операции с буфером
Обратите внимание: примеры в этом уроке задействуют общий буфер, поскольку все буферы являются подклассами класса “UIPasteboard“. Модель программирования применима к любому буферу.
Работа с общим буфером
Метод класса “generalPasteboard” возвращает ссылку на общий буфер — для наших примеров я настроил переменную буфера следующим образом:
1 | UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; |
Свойства типа “convenience”
Самые распространённые операции с буфером — получение и настройка строк, изображений, URL-адресов и цветов. Для удобства Apple предоставляет специальные “convenience” getter’ы/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]; |
Поддержка буферами множественных элементов
В последнем примере мы настраиваем свойство элементов (именно во множественном числе). Для простоты в уроке я рассматривал буфер как объект с одним элементом. При необходимости можно получать/настраивать из буфера массивы элементов. В принципе, ничего сверхсложного в этом нет: в основе лежит создание/поглощение массивов, а имена свойства/метода при этом становятся множественными. Подробнее об этом можно прочесть в документации.



Последние комментарии
ага, разобрался (скачал код и...
to tonic: У меня вот та же...
После 7-го шага у меня так и остались ошибки...
“В редакторе IB выберите объект...
Leon, дремовый камент. Иди играй в crusis.