Ответ 1
Перетаскивание из Finder всегда является перетаскиванием файла, а не перетаскиванием изображения. Вам нужно будет поддерживать перетаскивание URL-адресов из Finder.
Чтобы сделать это, вам нужно объявить, что вам нужны типы URL:
[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObject:(NSString*)kUTTypeFileURL]];
Вы можете проверить файлы следующим образом:
- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation
{
//get the file URLs from the pasteboard
NSPasteboard* pb = info.draggingPasteboard;
//list the file type UTIs we want to accept
NSArray* acceptedTypes = [NSArray arrayWithObject:(NSString*)kUTTypeImage];
NSArray* urls = [pb readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]]
options:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],NSPasteboardURLReadingFileURLsOnlyKey,
acceptedTypes, NSPasteboardURLReadingContentsConformToTypesKey,
nil]];
//only allow drag if there is exactly one file
if(urls.count != 1)
return NSDragOperationNone;
return NSDragOperationCopy;
}
Затем вам нужно будет снова извлечь URL-адрес при вызове метода tableView:acceptDrop:row:dropOperation:
, создать образ из URL-адреса и затем сделать что-то с этим изображением.
Даже если вы используете привязки Cocoa, вам все равно нужно назначить и реализовать объект как datasource
вашего NSTableView
, если вы хотите использовать методы перетаскивания. Подклассификация NSTableView
не принесет пользы, поскольку методы источника данных не реализованы в NSTableView
.
Вам нужно только реализовать связанные с перетаскиванием методы в объекте источника данных, а не те, которые предоставляют данные таблицы, когда вы используете привязки для этого. Это ваша обязанность уведомить контроллер массива о результате падения, вызвав один из методов NSArrayController
, например insertObject:atArrangedObjectIndex:
, или путем изменения массива подкачки с использованием методов доступа, соответствующих стандарту Key-Value Coding.