objective-c macos cocoa drag-and-drop nspasteboard

objective c - Arrastrando archivos a otras aplicaciones en Cocoa OSX



objective-c macos (1)

Estoy intentando convertir una aplicación de Windows en OSX, todo está funcionando ahora, excepto esta pequeña característica, la función de arrastrar y soltar archivos desde mi aplicación a cualquier otra ventana que admita gotas. Recibir gotas es fácil, el problema es ser la fuente de los datos para arrastrar.

Mi aplicación solo tiene 1 ventana con 1 vista, yo dibujo todos los controles allí. Así que simplemente extendí mi vista como esta @interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider> .

Ahora, el resto del código que tengo hasta ahora debería funcionar en mi opinión, pero de nuevo no sé mucho sobre el cacao y la 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];

FileList es una matriz de NSString* . Y donde veas view significa la interfaz NativeView , se implementa de esta manera porque está codificada dentro de C ++;

Actualmente, el código bloquea cuando intento establecer el pbItem en el pbItem . Quiero decir que nada más se ejecuta más allá de esa línea. También traté de deshacerme de NSPasteboard todo junto y usar NSPasteboardItem solamente, pero obtengo un EXC_BAD_ACCESS ejecutando la última línea: beginDraggingSessionWithItems .

No encontré ningún ejemplo en línea sobre cómo arrastrar archivos, todo lo que es NSImage y no me sirve para ese tipo de arrastre.

Cualquier ayuda será bienvenida, gracias.


Sí, falta bastante la documentación en línea.

Intenta usar el siguiente enfoque:

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]