Перетаскивание файлов в другие приложения в cocoa OSX

#objective-c #macos #cocoa #drag-and-drop #nspasteboard

#objective-c #macos #cocoa #перетаскивание #nspasteboard

Вопрос:

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

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

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

 NSArray *fileList = [NSArray arrayWithObjects:amp;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 all together и использовать NSPasteboardItem only, но я получаю EXC_BAD_ACCESS, выполняющий последнюю строку: beginDraggingSessionWithItems .

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

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

Ответ №1:

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

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

 auto* dragItems = [[NSMutableArray alloc] init];
for (autoamp; 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]