Перетаскивание какао, чтение данных - PullRequest
0 голосов
/ 07 июня 2010

Хорошо, у меня настроен NSOutlineView, и я хочу, чтобы он захватывал PDF-файлы, если PDF-файл перетаскивается в NSOutlineView.

Мой первый вопрос, у меня есть следующий код:

[outlineView registerForDraggedTypes:[NSArray arrayWithObjects:NSStringPboardType, NSFilenamesPboardType, nil]];

Во всех яблочных документах и ​​примерах, которые я видел, я также видел нечто вроде MySupportedType, являющегося объектом, зарегистрированным для перетаскивания. Что это значит? Должен ли я изменить код на:

[outlineView registerForDraggedTypes:[NSArray arrayWithObjects:@"pdf", NSStringPboardType, NSFilenamesPboardType, nil]];

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

Как говорится, я не уверен, как это сделать. У меня есть код:

- (BOOL)outlineView:(NSOutlineView *)ov acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)childIndex 
{
    NSPasteboard *pboard = [info draggingPasteboard];
    NSURL *fileURL;
    if ( [[pboard types] containsObject:NSURLPboardType] ) {
        fileURL = [NSURL URLFromPasteboard:pboard];
        // Perform operation using the file’s URL
    }

    NSData *data = [pboard dataForType:@"NSPasteboardTypePDF"];

Но на самом деле это никогда не дает никаких данных. Как я уже говорил, он получает URL, а не данные. Кто-нибудь есть какие-либо советы о том, как это сделать? Большое спасибо!

1 Ответ

4 голосов
/ 08 июня 2010

Типы перетаскивания

Перетаскиваемые типы - это просто строки, которые определяют системный тип монтажной панели (например, NSFilenamesPboardType) или собственный внутренний тип вашего приложения (например, «MyWidgetIdentifierType» для идентификации виджета по некоторому внутреннему идентификатору).

Тип перетаскивания "PDF" ничего вам не дает. Вы могли бы также назвать его «Bob8374Type» ... если вы не даете своему приложению возможности распознавать тип (или ничего не помещает что-либо в монтажную панель для этого типа), это совершенно бесполезно. Вы работаете с перетаскиваемыми файлами, поэтому NSFilenamesPboardType верен.

NSPasteboardTypePDF не поможет вам, если на монтажном столе нет данных NSPasteboardTypePDF. Когда файлы перетаскиваются, вы получаете NSFilenamesPboardType. Не имеет значения, является ли файл .pdf или .xyz; Вы только получаете пути.

Копировать файл или сохранить путь

Вам необходимо решить, намереваетесь ли вы скопировать удаленный PDF или просто сохранить путь (или, что еще лучше, ссылку на файловую систему) к нему. Если вы собираетесь копировать PDF-файл, вам необходимо убедиться, что вы знаете правильные места хранения (например, папку поддержки приложений и т. Д.).

Предполагая, что вы действительно хотите скопировать куда-нибудь PDF-файлы, вам не нужны данные PDF. Вы можете использовать NSFileManager для копирования (или перемещения) файла по указанному пути в новое место. Если у вас есть какой-то другой механизм хранения (т. Е. Вы хотите вставить данные PDF файла в какую-либо другую структуру данных), вы можете просто получить данные PDF напрямую, используя NSData + dataWithContentsOfURL: options: error: и делай со своими данными, что пожелаешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...