Новость из категории: Информация

Уроки iPhone SDK: копирование и вставка с помощью UIPasteboard

Уроки iPhone SDK: копирование и вставка с помощью UIPasteboard

В этом уроке мы рассмотрим основы считывания из буфера обмена и записи в него. Естественно, если все описанное в данное статье для вас - темный лес, то не тратьте свое время и просто обратитесь за помощь к сотрудникам AppCraft.pro, основная специализация которых - разработка приложений для iOS.

Уроки iPhone SDK: копирование и вставка с помощью UIPasteboard

Основы


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

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

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

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

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

Уроки iPhone SDK: копирование и вставка с помощью UIPasteboard

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


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



Работа с общим буфером
Метод класса “generalPasteboard” возвращает ссылку на общий буфер — для наших примеров я настроил переменную буфера следующим образом:
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];

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

NSString *string = pasteboard.string;
UIImage *image = pasteboard.image;
NSURL *url = pasteboard.URL;
UIColor *color = pasteboard.color;

pasteboard.string = @"paste me somewhere";

Определяем, имеется ли в наличии тип представления
Методы getter’ов возвращают ноль, если конкретный тип представления элемента отсутствует. Иногда узнать это лучше заранее. Для проверки воспользуйтесь методом “containsPasteboardTypes:”
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 достаточно привести их к нужному виду:
NSString *urlUTIType = (NSString *)kUTTypeURL;

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

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

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

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

Уроки iPhone SDK: копирование и вставка с помощью UIPasteboard

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

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

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];

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

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх