Чтение от области монтажа

Эта статья описывает, как считать данные из области монтажа.

Простое чтение

Вы считываете данные из области монтажа с помощью метода, readObjectsForClasses:options:.

Метод берет два параметра:

  1. Массив классов, экземпляры которых Вы интересуетесь чтением от области монтажа.

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

  2. Словарь, содержащий опции, связался с запросом.

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

Метод возвращает массив элементов, удовлетворяющих критерии, указанные параметрами. (Если существует ошибка в получении требуемых элементов от области монтажа или если никакие объекты указанных классов не могут быть созданы, возвраты метода nil.) Для каждого элемента на области монтажа:

  1. Каждый класс в массиве классов запрашивается для типов, которые это может считать (использование readableTypesForPasteboard:).

  2. Экземпляр создается из первого класса, найденного в массиве классов, читаемые типы которого соответствуют соответствующий тип, содержавшийся в элементе области монтажа

    Это - то, почему важно упорядочить классы в массиве классов согласно Вашему предпочтению. (Если никакой класс не найден, то никакой экземпляр не создается.)

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

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

NSPasteboard *pasteboard = <#Get a pasteboard#>; 
NSArray *classes = [[NSArray alloc] initWithObjects:[NSString class], nil];
NSDictionary *options = [NSDictionary dictionary];
NSArray *copiedItems = [pasteboard readObjectsForClasses:classes options:options];
if (copiedItems != nil) {
    // Do something with the contents...

Запрос многократных типов

Иногда можно быть готовы обработать многократные представления. Существует по крайней мере две стратегии получения элементов от области монтажа.

  1. Сделайте единственный вызов readObjectsForClasses:options: при передаче массива, содержащего классы, Вы хотите обработать.

  2. Сделайте многократные вызовы readObjectsForClasses:options:, каждый раз передавая различный массив классов.

Следующие примеры иллюстрируют два подхода.

В этом примере, для любого элемента, который может обеспечить и обогащенный текст и строковое представление, предпочтен обогащенный текст:

NSPasteboard *pasteboard = <#Get a pasteboard#>; 
NSArray *classes = [[NSArray alloc] initWithObjects:[NSAttributedString class], [NSString class], nil];
NSDictionary *options = [NSDictionary dictionary];
NSArray *copiedItems = [pasteboard readObjectsForClasses:classes options:options];
if (copiedItems != nil) {
    // Do something with the contents...
}

В этом примере область монтажа ищется сначала строковые объекты, и затем приписанные строки. Эта последовательность может привести к элементам области монтажа, «используемым» дважды, если они могут обеспечить и строку и приписанные строковые представления.

NSPasteboard *pasteboard = <#Get a pasteboard#>;
NSDictionary *options = [NSDictionary dictionary];
NSArray *classes;
 
classes = [[NSArray alloc] initWithObjects:[NSString class], nil];
NSArray *strings = [pasteboard readObjectsForClasses:classes options:options];
if (strings != nil) {
    // Do something with the strings...
}
 
classes = [[NSArray alloc] initWithObjects:[NSAttributedString class], nil];
NSArray *attributedStrings = [pasteboard readObjectsForClasses:classes options:options];
if (copiedItems != nil) {
    // Do something with the attributed strings...
}

Проверка

Иногда Вы хотите знать, содержит ли область монтажа данные, которые можно использовать, но фактически не получая данные. Например, Вы могли бы хотеть знать, должен ли пункт меню Paste быть включен, или допустима ли работа отбрасывания (в последовательности перетаскивания).

Чтобы определить, содержит ли область монтажа данные, которые могут создать экземпляры классов, которыми Вы интересуетесь, можно отправить область монтажа a canReadObjectForClasses:options: сообщение.

NSPasteboard *pasteboard = <#Get a pasteboard#>;
NSArray *classes = [[NSArray alloc] initWithObjects:[NSAttributedString class], [NSString class], nil];
NSDictionary *options = [NSDictionary dictionary];
BOOL ok = [pasteboard canReadObjectForClasses:classes options:options];
if (ok) {
    // ...
}

Опции чтения URL

Иногда можно хотеть получить URLs от области монтажа, но только если они встречают определенные ограничения — например, можно только интересоваться файлом URLs или URLs, указывающий на данные определенного типа. Можно наложить такие ограничения с помощью параметра опций при проверке содержания использования области монтажа canReadObjectForClasses:options:, или читайте из использования области монтажа readObjectsForClasses:options:.

Вы используете NSPasteboardURLReadingFileURLsOnlyKey опция ограничить результаты зарегистрировать URLs, как показано в этом примере.

NSPasteboard *pasteboard = <#Get a pasteboard#>;
NSArray *classes = [NSArray arrayWithObject:[NSURL class]];
 
NSDictionary *options = [NSDictionary dictionaryWithObject:
    [NSNumber numberWithBool:YES] forKey:NSPasteboardURLReadingFileURLsOnlyKey];
 
NSArray *fileURLs =
    [pasteboard readObjectsForClasses:classes options:options];

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

NSPasteboard *pasteboard = <#Get a pasteboard#>;
NSArray *classes = [NSArray arrayWithObject:[NSURL class]];
 
NSDictionary *options = [NSDictionary dictionaryWithObject:
    [NSImage imageTypes], forKey:NSPasteboardURLReadingContentsConformToTypesKey];
 
NSArray *imageURLs =
    [pasteboard readObjectsForClasses:classes options:options];

Можно объединить эти две опции; для получения только файла URLs, указывающий на данные изображения Вы создали бы словарь опций следующим образом:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSPasteboardURLReadingFileURLsOnlyKey,
    [NSImage imageTypes], NSPasteboardURLReadingContentsConformToTypesKey, nil];