2016-10-15 8 views
1

Я пытаюсь преобразовать приложение Windows в OSX, теперь все работает, кроме этой небольшой функции, перетащить капюшон файлов из моего приложения в любое другое окно, которое поддерживает капли. Получение капель легко, проблема заключается в том, что источник данных перетаскивается.Перетаскивание файлов в другие приложения в cocoa OSX

Мое приложение имеет только 1 окно с 1 видом, я рисую каждый элемент управления сам там. Поэтому я просто расширил свое представление следующим образом: @interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider>.

Теперь ресто кода я до сих пор должны работать по-моему, но опять же я не знаю, что много о какао и OSX:

NSArray *fileList = [NSArray arrayWithObjects:&pathList[0] count:pathList.size()]; 

NSPasteboard *pboard = [NSPasteboard pasteboardWithName: NSDragPboard]; 
[pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil]; 
[pboard setPropertyList:fileList forType:NSFilenamesPboardType]; 

NSPasteboardItem *pbItem = [NSPasteboardItem new]; 
[pbItem setDataProvider:view forTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; 
[pbItem pasteboard:pboard provideDataForType:NSFilenamesPboardType]; 

NSDraggingItem *dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem]; 
[dragItem setDraggingFrame:NSMakeRect(0, 0, 10, 10)]; 


[view beginDraggingSessionWithItems:[NSArray arrayWithObjects:dragItem, nil] event:mouseEvent source:view]; 

список файлов массив NSString*. И где вы видите view, это означает интерфейс NativeView, он реализован таким образом, потому что он закодирован в C++;

В настоящее время код блокируется, когда я пытаюсь установить pasteboard в pbItem. Я имею в виду, что за этой линией ничего не выполняется. Я также пытался избавиться от NSPasteboard и использовать только NSPasteboardItem, но я получаю EXC_BAD_ACCESS, работающий с последней строкой: beginDraggingSessionWithItems.

Я не нашел примеров онлайн о перетаскивании файлов, все, что есть, NSImage, и я не могу использовать этот тип перетаскивания.

Любая помощь будет рада, спасибо.

ответ

0

Да, онлайн-документации довольно не хватает.

Попробуйте использовать следующий подход:

auto* dragItems = [[NSMutableArray alloc] init]; 
for (auto& path : pathList) 
{ 
    auto* fileURL = [NSURL fileURLWithPath: path]; 
    auto* dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL]; 
    [dragItem setDraggingFrame: NSMakeRect(0, 0, 10, 10)]; 
    [dragItems addObject: dragItem]; 
} 

[view beginDraggingSessionWithItems: dragItems 
           event: mouseEvent 
          source: view]