Перетащите файл из NSTableView в другое приложение OSX - PullRequest
3 голосов
/ 02 декабря 2010

Я хочу перетащить файл из строки NSTableView, чтобы скопировать его в другое приложение (например, Finder).Я реализовал первые два шага («Настройка представления таблицы», «Начало операции перетаскивания») этого руководства и подумал, что это поможет: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TableView/Tasks/UsingDragAndDrop.html

Однако, когда я пытаюсь перетащить строку, текст строки следует за моей мышью, но файл не копируется при освобождении.Вот что я отправляю в свой UITableView при инициализации:

#define librarySongDataType @"NSFileContentsPboardType"
- (void)awakeFromNib
{
    [self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; // allow interapplication drags
    [self registerForDraggedTypes:[NSArray arrayWithObject:librarySongDataType] ]; // NSFileContentsPboardType
}

Вот как я обрабатываю перетаскивание в источнике данных моего NSTableView (NSArrayController):

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
{
    NSLog(@"writeRowsWithIndexes");
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
    [pboard setData:data forType:librarySongDataType];
    return YES;
}

Чтобы бытьясно, я не пытаюсь перетаскивать файлы в табличное представление, я просто пытаюсь перетащить файлы из них.

1 Ответ

10 голосов
/ 02 декабря 2010

Во-первых, на какой документ вы ссылались, когда писали эту строку?

 [self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; 

Это не имеет смысла. Не используйте NSUIntegerMax. Используйте рабочие маски, как определено здесь . Там написано, что NSUIntegerMax означает все, но вы не должны его использовать; Apple может переопределить бит в будущем. Вы должны использовать NSDragOperationCopy или что-то конкретное. Если вы скопировали эту строку с веб-страницы или книги, вам следует прекратить доверять этой книге / веб-странице.

Во-вторых, forLocal: должно быть NO для передачи данных в другое приложение; local здесь означает приложение локальное.

В-третьих, вместо установки архивных данных в

 [pboard setData:data forType:librarySongDataType];

Рассмотрите возможность создания NSFileWrapper и установите его с помощью writeFileWrapper:, см. здесь . Таким образом, вы можете указать имя файла, который будет создан в Finder. В противном случае система не имеет представления о том, что представляют собой данные.

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